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中
我们可以在中写⼊ADD_DEIFNITIONS(-D _WIN32)来添加程序运⾏时⽤到的宏。但是这样,⼀旦我们需要修改使⽤的宏,就要修改⽂件,会很⿇烦。
这时我们可以这样做:
在中写⼊
IF(ENVIRO)
ADD_DEFINITIONS(-D _WIN32)
ENDIF(ENVIRO)
这样,我们可以在使⽤cmake命令的时候加⼊-D选项,定义ENVIRO 命令如下
cmake -D ENVIRO=1,或者 cmake -D ENVIRO=ON
switch的用法c语言如果要取消这个定义可以使⽤: cmake -D ENVIRO=OFF 或 cmake -D ENVIRO=0 或者cmake -U ENVIRO
就写到这⾥了,希望对你有帮助。。⽔平有限,有错误的地⽅还请谅解,并诚邀指正。。
总结
以上是编程之家为你收集整理的C语⾔中条件编译详解全部内容,希望⽂章能够帮你解决C语⾔中条件编译详解所遇到的程序开发问题。
如果觉得编程之家⽹站内容还不错,欢迎将编程之家⽹站推荐给程序员好友。
本图⽂内容来源于⽹友⽹络收集整理提供,作为学习参考使⽤,版权属于原作者。
⼩编个⼈号 jb51ccc
喜欢与⼈分享编程技术与⼯作经验,欢迎加⼊编程之家官⽅交流!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论