条件编译

定义

“条件编译”通过改变一个或多个条件,指定文件中的某一部分代码是否需要编译到可执行文件中,从而起到隐藏调试输出信息、适应不同运行环境等作用。常见的语法有如下三种:
#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
posted @ 2026-08-31 10:36  雏扬  阅读(4)  评论(0)    收藏  举报