第22课 - 条件编译使用分析
这节课我们介绍如何使用C语言中的条件编译。
市面上的电子产品一般有低配版、中配版、高配版,那相应的软件也要开发三个版本吗?显然不是这样的,我们一般在同一套代码中使用条件编译区分不同的版本。
1. 基本概念
(1)c 程序的编译一般经过如下四个过程
条件编译是在预处理阶段由预处理器完成的,预处理器根据条件编译指令选择使用哪些代码。
(2)条件编译的行为类似于if ...else...语句,但他们有本质的区别。前者在预处理阶段进行分支判断,后者在程序运行期间进行分支判断
1 // #include <stdio.h> 2 3 #define C 1 4 5 int main() 6 { 7 const char* s; 8 9 #if( C == 1 ) // 条件成立,选择该分支 10 s = "This is first printf...\n"; 11 #else 12 s = "This is second printf...\n"; 13 #endif 14 15 // printf("%s", s); 16 17 return 0; 18 }
使用 gcc -E 命令查看该程序由预处理器处理后的结果
swj@ubuntu:~/c_course/ch_22$ gcc -E test.c
# 1 "test.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "test.c"int main()
{
const char* s;s = "This is first printf...\n";
return 0;
}
(3)除了在代码中定义宏,可以通过命令行定义宏 -D后面的宏会在预处理时传递到程序中(D是definition的缩写)
gcc –Dmacro=value file.c // 针对 #if 语句
gcc –Dmacro file.c // 针对 #ifdef 或 ifndef 语句
// 查看gcc的man手册,这种形式下macro的值为1
下面验证-D选项的功能
1 #include <stdio.h> 2 3 int main() 4 { 5 const char* s; 6 7 #if( C == 1 ) 8 s = "This is first printf...\n"; 9 #else 10 s = "This is second printf...\n"; 11 #endif 12 13 printf("%s", s); 14 15 return 0; 16 }
上面代码删除了#define C 1,观察下面的编译命令及程序的输出结果
这里如果直接 gcc test.c 程序也可以编译通过,在预处理 #if( C==1 ) 时,如果没有定义C,那么这里就为“假”(并没有报错)。
2. #include的本质
3. 条件编译的意义