条件编译基本概念
·条件编译的行为类似于C语言中的if...else...
·条件编译是预编译指示命令,用于控制是否编译某段代码
例子22-1:

include "stdio.h"

define C 1

int main()
{

 char *s;
#if (C == 1)
 s = "This is first printf...\n";
#else
 s = "This is second printf...\n";
#endif
 printf("%s",s);
 return 0;

}
输出结果:
This is first printf...

条件编译的本质
·预处理器根据条件编译指令有选择的删除代码
·编译器不知道代码分支的存在
·if...else...语句在运行期进行分支判断
·条件编译指令在预编译期进行分支判断
·可以通过命令行定义宏

·#ifdef判断某个宏是否被定义,若已经被定义,执行随后的语句
·#ifndef判断某个宏是否未被定义
·#endif是#if, #ifdef, #ifndef这些条件命令的结束标志
·#include的本质是将已经存在的文件内容嵌入到当前文件中
·#include的间接包含同样会产生嵌入文件内容的操作

前面有#号说明与预处理器相关
·条件编译可以解决头文件重复包含的编译错误

例子22-2:
test.h文件代码:

ifndef TEST_H

define TEST_H

include "global.h"

const char *NAME = "test.h";
char *hello_world()
{

return "Hello world!\n";

}

endif

global.h文件代码:

ifndef GLOBAL_H

define GLOBAL_H

int global = 10;

endif

test.c文件代码:

include "global.h"

include "test.h"

int main()
{

const char *s = hello_world();
int g= global;
return 0;

}
条件编译的意义:
·条件编译使得我们可以按不同的条件编译不同的代码段,因而可以产生不同的目标代码
·#if...#else...#endif被预编译期处理,而if...else...语句被编译器处理,必然被编译进目标代码。
·实际工程中条件编译主要用于以下两种情况
-不同的产品线共用一份代码
-区分编译产品的调试版和发布版
小结:
·通过编译器命令能够定义预处理器使用的宏
·条件编译可以避免重复包含同一个头文件
·条件编译是在工程开发中可以区别不同产品线的代码
·条件编译可以定义产品的发布版与调试版


YingLi
6 声望4 粉丝

From zero to hero.