1. 基本概念
(1)条件编译的行为类似于C语言中的if…else…
(2)条件编译是预编译指示命令,用于控制是否编译某段代码
【实例分析】条件编译初探
22-1.c源文件 | 经预编译器处理条件编译后的结果(22-1.i文件) |
// #include <stdio.h> #define C 1 int main() { const char* s; #if( C == 1 ) //#ifdef主要用于#define C这种情况 s = "This is first printf...\n"; #else s = "This is second printf...\n"; #endif // printf("%s", s); return 0; }
|
# 1 "22-1.c" # 1 "<built-in>" # 1 "<command-line>" # 1 "22-1.c" int main() { const char* s; s = "This is first printf...\n"; return 0; } |
2. 条件编译的本质
(1)预编译器根据条件编译指令有选择的删除代码
(2)编译器不知道代码分支的存在
(3)if…else…语句在运行期进行分支判断
(4)条件编译指令在预编译期进行分支判断
(5)可以通过命令行定义宏
gcc –Dmarco=value file.c //针对#if语句
gcc –Dmarco file.c //针对#ifdef或ifndef语句
【编程实验】通过命令行定义宏
//#include <stdio.h> int main() { const char* s; //单步编译时,可能在命令行中进行宏定义 //如:gcc -E 22-2.c -DC -o 22-2.i #ifdef C //注意与22-1.c文件的区别 s = "This is first printf...\n"; #else s = "This is second printf...\n"; #endif //printf("%s",s); return 0; }
3.#include的本质
(1)#include的本质是将己经存在的文件内容嵌入到当前文件中
(2)#include的间接包含同样会产生嵌入文件内容操作
▲间接包含同一个文件是否会产生编译错误?(答:在预编译阶段,global.h会被两次地嵌入到test.c文件中,此时并不会报错。但进入编译阶段,就会出现错误,如定义或函数重定义)
【实例分析】条件编译的使用
(3)条件编译可以解决头文件重复包含的编译错误
#ifndef _HEADER_FILE_H_ //ifndef,否定 #define _HEADER_FILE_H_ //紧接着定义这个宏 //source code #endif
4. 条件编译的意义
(1)条件编译使得我们可以按不同的条件编译不同的代码段,因而可以产生不同的目标代码。
(2)#if…#else…#endif被预编译器处理,而if…else…语句被编译器处理,必然被编译进目标代码。
(3)实际工程中条件编译主要用于以下两种情况:
①不同的产品线共用一份代码
②区分编译产品的调试版和发布版
【实例分析】产品线区分及调试代码应用
5. 小结
(1)通过编译器命令行能够定义预处理器使用的宏
(2)条件编译可以避免重复包含同一个头文件
(3)条件编译是在工程开发中可以区别不同产品线和代码
(4)条件编译可以定义产品的发布版和调试版
原文:http://www.cnblogs.com/5iedu/p/5328681.html