条件编译
0.前言
- 本文的程序是在linux下测试通过的
本文的分析通过了下面的命令来查看预编译结果
gcc -E filename.c -o filename.i
这条命令的作用是生成预处理文件filename.i
gcc -S filename.c -o filename.s
这条命令的作用是生成预编译文件filename.s
gcc -c filename.c -o filename.o
这条命令的作用是生成汇编文件filename.o
1.使用情况
- 不同的产品线公用一份代码
- 区分编译产品的调试版和发布版
2.函数的包含
- #if…#else…#endif
#define C 1
int main()
{
#if(C == 1)
printf("This is first printf...\n");
#else
printf("This is second printf...\n");
#endif
return 0;
}
在linux下也可以使用gcc -DC=1 filename.c -o filename执行,效果和上面相同
在gcc下 -D是进入宏的意思
- if…else
#define C 1
int main()
{
if(C == 1)
printf("This is first printf...\n");
else
printf("This is second printf...\n");
return 0;
}
- 区别:
1.条件编译是预编译指令(最终预编译是只有一条printf),控制是否编译某段代码(确定的)
2.if…else是在运行时选择(最终有两条printf),分开执行某些代码
3.头文件的包含
- 问题:
如果一个函数调用了一个头文件,同时这个头文件包含了另外一个头文件,那么在编译时会出现错误,意思为重复定义另外一个头文件的内容
- 解决:
可以在被包含的头文件里使用条件编译(一般的编译器已经自动添加了)
#ifdef (_头文件名_H_)
#define (_头文件名_H_)
#endif
4.条件编译的使用
#ifdef DEBUG
//宏定义日志文件
#define LOG(s) printf("[%s:%d] %s\n", __FIEL__, __LINE__, s)
#else
#define LOG(S) NULL
#endif
#ifdef Product
void f()
{
printf("This is a Product!\n");
}
#else
void f()
{}
#endif
int main()
{
LOG("Enter main...\n");
f();
printf("1 Query\n");
printf("2 Record\n");
printf("3 Delete\n");
#ifdef Product //高级查询
printf("4 Product\n");
printf("5 Services\n");
printf("6 Exit\n");
#else
printf("4 Exit\n");
#endif
LOG("Exit main...\n");
return 0;
}