条件编译
定义
“条件编译”通过改变一个或多个条件,指定文件中的某一部分代码是否需要编译到可执行文件中,从而起到隐藏调试输出信息、适应不同运行环境等作用。常见的语法有如下三种:
#ifdef 标识符...#else...#endif , #ifndef 标识符...#else...#endif, #if 常量表达式...#else...#endif
[!warning] 注意:
与常见的if...else if...else...不同,条件编译语法 不需要 使用花括号将代码块括起来,其语法与Python中的“等缩进显示”类似。
语法1:看标识符是否被定义
#define EXIST
int main() {
#ifdef EXIST
// 存在时编译
#else
// 不存在时编译
#endif
#ifndef EXIST
// 不存在时编译
#else
// 存在时编译
#endif
return 0;
}
[!done] 提示:
该语法适合 手动决定 某段代码是否被编译,如决定调试输出的开关。
语法2:和 if 类似,看表达式是否为真
int main() {
#if 1
// 编译
#else
// 不编译
#endif
#if 0
// 不编译
#else
// 编译
#endif
}
如果 #if 的作用仅限于计算并判断编码者手动给定的常量表达式是否为真,那它和 #ifdef 没有本质性的区别。
但是:
[!info] 预处理器在
#if中判断的值还包括编译器自动定义的“环境宏” 等。
这些值不是编码者写的,而是编译器在启动时根据当前系统环境自动注入的。
这才是#if最大的威力所在:检测程序的编译环境,针对不同的环境选择性地编译不同的代码,从而实现现代嵌入式开发中“一套代码、万种芯片”的效果。
举例如下:
// 这些宏的值不是程序员写的,是编译器根据当前电脑/手机环境自动给的
#if __STDC_VERSION__ >= 201112L
printf("当前编译器支持 C11 标准");
#endif
#if __GNUC__ > 5
#pragma GCC optimize("O3") // 如果是 GCC 6.0 以上,启用最高优化
#endif
#if defined(__arm__) || defined(_M_ARM)
// 如果编译器检测到当前编译目标是 ARM 芯片,则编译这段 ARM 汇编
__asm { ... }
#elif defined(__x86_64__)
// 如果是 64 位 x86 芯片,则编译这段 Intel 汇编
__asm { ... }
#endif

浙公网安备 33010602011771号