1、基本概念:
条件编译的行为类似于if...else语句,只是在条件编译中,满足条件的才会被保留下来以备编译。
条件编译是预编译指示命令,用于控制是否编译某段代码。
示例:
#include <stdio.h>
#define COMMAND 1
int main()
{
#if(COMMAND == 1)
printf("COMMAND == 1");
#else
printf("COMMAND != 1");
#endif
return 0;
}
可以用gcc预编译一下,能看到预编译后的文件中,只剩下如下的内容:
int main()
{
printf("COMMAND == 1");
return 0;
}
很明显,条件编译和if...else是有本质区别的,不满足条件的代码不会被编译进最后的源代码中。
2、什么时候使用条件编译?
示例:建立如下三个文件,并写如下代码:
/*test.c*/
#include <stdio.h>
#include "test.h"
#include "global.h"
int main()
{
printf("global=%d,num=%d,global*num=%d",global,num,func());
return 0;
}
/*test.h*/
#include <stdio.h>
#include "global.h"
int num=10;
int func()
{
return global*num;
}
/*global.h*/
int global=3;
试着编译一下test.c,会发现编译器报错,大概意思是已经定义了global变量,为什么会这样呢?使用命令行预编译一下,然后看.i文件,
预编译后生成的文件内容如下:
# 3 "test.c" 2
# 1 "test.h" 1
# 1 "global.h" 1
int global=3;
# 4 "test.h" 2
int num=10;
int func()
{
return global*num;
}
# 4 "test.c" 2
# 1 "global.h" 1
int global=3;
# 5 "test.c" 2
int main()
{
printf("global=%d,num=%d,global*num=%d",global,num,func());
return 0;
}
可以看到,这里定义两次int global=3;,可是为什么会发生这种情况?
问题出在,我们在test.h和test.c中都包含了global.h文件,而test.c中又包含了test.h文件,这样在预编译阶段展开#include指令时,就把global.h文件展开了两次,而预编译器并不知道将此文件包含了两次,所以在编译阶段就发生了错误!
如何改正??
使用条件编译!
我们做如下的修改:
/*test.h*/
#include <stdio.h>
#include "global.h"
#ifndef _TEST_H_
#define _TEST_H_
int num=10;
int func()
{
return global*num;
}
#endif // _TEST_H_
/*global.h*/
#ifndef _GLOBAL_H_
#define _GLOBAL_H_
int global=3;
#endif
再次编译,就没问题了!添加的条件编译的指令意思为:如果没有定义_GLOBAL_H_宏,则就保留里面的语句,否则就不保留,这样就能避免重复定义变量。