武林c语言,详解C语言中条件编译

预处理器提供条件编译,程序的不同部分可以在不同的条件下编译,从而产生不同的目标代码文件,这对于程序移植和调试非常有用,本文是武林技术频道小编给为大家带来的详解中条件编译,一起来了解一下吧!

通常情况,我们想让程序选择性地执行,多会使用分支语句,比如if-else 或者switch-case 等。但有些时候,可能在程序的运行过程中,某个分支根本不会执行。

比如我们要写一个跨平台项目,要求项目既能在Windows下运行,也能在Linux下运行。这个时候,如果我们使用if-else,如下:

Windows 有专有的宏_WIN32,Linux 有专有的宏__linux__

if(_WIN32) printf("Windows下执行的代码/n");else if(__linux__) printf("Linux下执行的代码/n");else printf("未知平台不能运行!/n");

这段代码存在两个问题:1、 在Windows下并没有定义__linux__,编译的时候会报错,同样在Linux中也没有定义_WIN32。2、 假定这段程序可以运行,那么在Windows环境下另外两个分支的代码根本不可能运行,同理在Linux下也一样。

处理这种情况我们可以使用条件编译。条件编译,顾名思义,就是根据一定的条件进行选择性的编译,我们要达到的效果,就是在Windows环境下另外两个分支的语句根本不会编译,这样生成的可执行文件中,也不会还有对应语句的机器码,这样既提高了编译效率,同时也减小了可执行文件的体积。

条件编译通常可以用三种方式实现:

1、 #if--#elif--#else--#endif语句实现

通过这种方法实现的代码为:

#if(_WIN32) printf("Windows下执行的代码/n");#elif (__linux__) printf("Linux下执行的代码/n");#else printf("未知平台不能运行!/n");#endif

使用这种方式时需要注意,宏定义为真实#if才会执行,也就是说:

假如有宏定义#define _WIN32 0 这个时候#if是不会执行的。需要定义为#define _WIN32 1才会执行

2、 通过#ifdef--#else--#endif语句实现

通过这种方式实现的代码为

#ifdef(_WIN32) printf("Windows下执行的代码/n");#else printf("Linux下执行的代码/n");#endif

这种方法下只需要定义了_WIN32就可以,没有必要为真,也就是说

如果有宏定义#define _WIN32 0 上面#ifdef语句也是可以执行的,甚至#define _WIN32 上面的#ifdef也可以运行

当然也可以加入第一种方法中的#elif语句

#ifdef(_WIN32) printf("Windows下执行的代码/n");#elif (__linux__) printf("Linux下执行的代码/n");#else printf("未知平台不能运行!/n");#end

但是需要注意的是,这种情况下,要想#elif语句执行__linux__的值必须为真!(同时没有定义_WIN32)

3、 使用#ifndef语句,这种情况类似第二种,ifndef就是如果没有定义宏,就执行。

在gcc编译工具中

我们可以使用-D选项,动态地定义程序所需要的宏

比如我们可以这样编译 gcc test.c -o test -D _WIN32      这样程序就可以在Windows下运行了(当然,实际情况是在Windows环境下,_WIN32已经被定义) gcc中的-D选项会默认将宏定义为1,如果要定义为其他的值使用等于号如:-D _WIN32=0

很多的时候,尤其是实际的项目中,我们会使用cmake工具来构建自己的程序。

在cmake中

我们可以在CMakeLists.txt中写入ADD_DEIFNITIONS(-D _WIN32)来添加程序运行时用到的宏。但是这样,一旦我们需要修改使用的宏,就要修改CMakeLists.txt文件,会很麻烦。

这时我们可以这样做:

在CMakeLists.txt中写入

IF(ENVIRO) ADD_DEFINITIONS(-D _WIN32)ENDIF(ENVIRO)

这样,我们可以在使用cmake命令的时候加入-D选项,定义ENVIRO 命令如下

cmake -D ENVIRO=1,或者 cmake -D ENVIRO=ON

如果要取消这个定义可以使用: cmake -D ENVIRO=OFF 或 cmake -D ENVIRO=0 或者cmake -U ENVIRO

以上就是由武林技术频道小编带来的详解C语言中条件编译?希望对大家有所帮助!如果大家还想得到更多关于这方面的知识,那就继续关注武林技术频道吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471381.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 2114. 句子中的最多单词数

文章目录1. 题目2. 解题1. 题目 一个 句子 由一些 单词 以及它们之间的单个空格组成,句子的开头和结尾不会有多余空格。 给你一个字符串数组 sentences ,其中 sentences[i] 表示单个 句子 。 请你返回单个句子里 单词的最多数目 。 示例 1&#xff1…

loadView加载(变换成ScrollView)

/**loadView加载,将系统的view变换成ScrollView*/ - (void)loadView{ [super loadView]; UIScrollView *mainScroll [[UIScrollView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame]; mainScroll.scrollEnabled YES; mainScroll.contentSize CGSizeMake(0, …

c语言(int)x 100,【单选题】下列语句执行后,变量a、c的值分别是( ) int x=182; int a,c;c=x/100;a=x%10;...

【单选题】下列语句执行后,变量a、c的值分别是( ) int x182;int a,c;cx/100;ax%10;更多相关问题阅读下面短文,掌握其大意,然后从36-55各题所给的四个选项(A、B、C和D)中,选出最佳选项。In the seventh gradeFor several days I sa…

一、css清除浮动方法学习笔记总结(超详细,简单易懂)

** css清除浮动方法学习笔记总结(超详细,简单易懂) ** 问题: 上图中,由于container(父级元素)未设置高度,其内部子元素设置了float浮动,导致与container同级(也就是co…

LeetCode 2115. 从给定原材料中找到所有可以做出的菜(拓扑排序)

文章目录1. 题目2. 解题1. 题目 你有 n 道不同菜的信息。给你一个字符串数组 recipes 和一个二维字符串数组 ingredients 。 第 i 道菜的名字为 recipes[i] ,如果你有它 所有 的原材料 ingredients[i] ,那么你可以 做出 这道菜。一道菜的原材料可能是 另…

C语言makefile文件详解,makefile讲解

仅供自己学习使用一、Makefile介绍Makefile 或 makefile: 告诉make维护一个大型程序, 该做什么。Makefile说明了组成程序的各模块间的相互 关系及更新模块时必须进行的动作, make按照这些说明自动地维护这些模块。执行make命令时,需要一个 Ma…

二、MySQL连接查询学习笔记(多表连接查询:内连接,外连接,交叉连接详解)

MySQL连接查询(多表连接查询:内连接,外连接,交叉连接详解) 6:多表连接查询 笛卡尔乘积:如果连接条件省略或无效则会出现 解决办法:添加上连接条件连接查询的分类: 1.按…

二维数组和指针数组

#include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int arr1[3]; int arr2[3]; int arr3[3]; int * ptr; // ptr1是一个指向 int [3] 的指针&#xff0c;即ptr的类型和&arr1的类型是一样的&#x…

android 本机号码一键登录,什么是本机号码一键登录?APP本机号码一键登录如何实现?...

三大运营商推出一键登录的服务后&#xff0c;由于其便捷性和安全性都好于传统短信验证码&#xff0c;越来越多的APP注册登录环节都在使用本机号码一键登录验证方式。本文主要介绍了本机号码一键登录特点以及实现方法。一、什么是本机号码一键登录&#xff1f;平时我们填手机号接…

LeetCode 2116. 判断一个括号字符串是否有效(栈)

文章目录1. 题目2. 解题1. 题目 一个括号字符串是只由 ( 和 ) 组成的 非空 字符串。 如果一个字符串满足下面 任意 一个条件&#xff0c;那么它就是有效的&#xff1a; 字符串为 ().它可以表示为 AB&#xff08;A 与 B 连接&#xff09;&#xff0c;其中A 和 B 都是有效括号字…

NavigationController

前面的一篇文章《iOS开发16&#xff1a;使用Navigation Controller切换视图》中的小例子在运行时&#xff0c;屏幕上方出现的工具栏就是Navigation Bar&#xff0c;而所谓UINavigationItem就可以理解为Navigation Bar中的内容&#xff0c;通过编辑UINavigationItem&#xff0c;…

android studio windows,AndroidStudio的使用(Windows)

演示模式View---Enter presentation mode演示代码快捷提示commondshfita最近修改的文件ctrlshfite代码书签在一行代码处使用F11也可以在navigate--bootmarkPaste_Image.png回退到上一个浏览的地方ctrlaltleft/right快速进入方法内ctrlb查看方法的参数定义commondpPaste_Image.p…

一、MySQL查询学习笔记(基础查询、条件查询、排序查询、常见函数、分组查询 详解)

DQL语言的学习 一、基础查询 语法&#xff1a; **SELECT 要查询的东西 【FROM 表名】;**类似于Java中 :System.out.println(要打印的东西); 特点&#xff1a; ①通过select查询完的结果 &#xff0c;是一个虚拟的表格&#xff0c;不是真实存在 ② 要查询的东西 可以是常量值、…

LeetCode 2119. 反转两次的数字

文章目录1. 题目2. 解题1. 题目 反转 一个整数意味着倒置它的所有位。 例如&#xff0c;反转 2021 得到 1202 。反转 12300 得到 321 &#xff0c;不保留前导零 。 给你一个整数 num &#xff0c;反转 num 得到 reversed1 &#xff0c;接着反转 reversed1 得到 reversed2 。 …

JVM系列五:JVM监测工具[整理中]

转自本站&#xff1a;http://www.cnblogs.com/redcreen/archive/2011/05/09/2040977.html 前几篇篇文章介绍了介绍了JVM的参数设置并给出了一些生产环境的JVM参数配置参考方案。正如之前文章中提到的JVM参数的设置需要根据应用的特性来进行设置&#xff0c;每个参数的设置都需要…

红米k30 android版本,Redmi K30 Pro 推送 MIUI 12.2.1 稳定版:为安卓跨版本升级

今日&#xff0c;Redmi K30 Pro 推送了 MIUI 12.2.1 稳定版内测更新。新系统基于 Android 11 深度定制&#xff0c;更新了 2020 年 10 月谷歌安全补丁。需要注意的是&#xff0c;本次更新为安卓跨版本升级&#xff0c;为降低升级风险&#xff0c;建议提前备份个人数据。同时&am…

三、MySQL子查询学习笔记(标量子查询、列子查询、行子查询、表子查询 详解)

三、MySQL子查询学习笔记 7&#xff1a;子查询 含义&#xff1a; 一条查询语句中又嵌套了另一条完整的select语句&#xff0c;其中被嵌套的select语句&#xff0c;称为子查询或内查询&#xff1b;在外面的查询语句&#xff0c;称为主查询或外查询 分类&#xff1a; 一、按子查…

LeetCode 2120. 执行所有后缀指令(模拟)

文章目录1. 题目2. 解题1. 题目 现有一个 n x n 大小的网格&#xff0c;左上角单元格坐标 (0, 0) &#xff0c;右下角单元格坐标 (n - 1, n - 1) 。 给你整数 n 和一个整数数组 startPos &#xff0c;其中 startPos [startrow, startcol] 表示机器人最开始在坐标为 (startrow…

android代理生命周期,了解 Activity 生命周期

当用户浏览、退出和返回到您的应用时&#xff0c;您应用中的在生命周期回调方法中&#xff0c;您可以声明用户离开和再次进入 Activity 时 Activity 的行为方式。例如&#xff0c;如果您正构建流媒体视频播放器&#xff0c;当用户切换至另一应用时&#xff0c;您可能要暂停视频…

Module System of Swift (简析 Swift 的模块系统)

原文地址: http://andelf.github.io/blog/2014/06/19/modules-for-swift/ Swift 中模块是什么&#xff1f;当写下 Swift 中一句 import Cocoa 的时候到底整了个什么玩意&#xff1f;官方 ibook 很含糊只是提了半页不到。 本文解决如下问题 介绍 Swift 中两种可 import 的模块如…