C语言中的条件编译
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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
就写到这⾥了,希望对你有帮助。
⽔平有限,有错误的地⽅还请谅解,并诚邀指正。