------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1、为什么要使用条件编译?
1)按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。有利于程序的调试。
2)条件编译当然也可以用条件语句来实现,但是用条件语句将会对整个程序进行编译,生成的目标程序很长,而采用条件编译,则根据条件之编译其中的程序段1或者程序段2,生成目标程序较短。
条件编译:发生在预处理阶段,在编译之前做的事情。
核心:根据条件编译指定的代码,条件不同,编译的部分也不同,生成的目标文件大小也不一样。
条件编译指令有:#if #elif #else #endif #ifdef #ifndef
(1)#if #elif #else #endif的使用:
//#define score 78
int main(int argc, char* argv[])
{
int score=78;
if(score<59) //使用条件语句
printf("该生成绩为:E\n"); //打印count值
else if(score<69)
printf("该生成绩为:D\n");
else if(score<79)
printf("该生成绩为:C\n");
else if(score<89)
printf("该生成绩为:B\n");
else
printf("该生成绩为:A\n");
/* #if(score<59) //使用条件编译语句
printf("该生成绩为:E\n");
#elif(score<69)
printf("该生成绩为:D\n");
#elif(score<79)
printf("该生成绩为:C\n");
#elif(score<89)
printf("该生成绩为:B\n");
#else
printf("该生成绩为:A\n");
#endif*/
return 0;
}
我们将条件编译指令的代码段注释掉,仅用条件语句进行编译,然后用终端进行手动编译并找到生成的目标文件main.o,查看大小1164bit。
然后我们将条件语句的注释掉,使用条件编译语句进行编译,得到目标文件main.o大小为836bit。
也就是说,在程序预编译阶段,编译器通过score的宏定义的值来判断留下符合条件的那一段代码,不符合条件的都省略掉,不进行编译。如上面的那段程序,宏定义的score为78,编译器预处理的时候就只留下了printf("该生成绩为:C\n"); 这句符合条件的代码,其他都被省略。这样自然就缩小了目标文件的大小。
(2)#ifdef ( 用来判断某个宏是否定义),#ifndef(如果没有定义某个宏)
这来个条件编译指令很简单,#ifdef 用法如下:
#ifdef 标识符
程序段1
#else
程序段2
#endif
#ifndef用法如下:
#ifndef 标识符
程序段1
#else
程序段2
#endif
举例:
#define Debug1 1 //宏定义Debug1
int main(int argc, char* argv[])
{
#ifdef Debug1 //判断
printf("我们定义了Debug1\n"); //程序段1
#else
printf("我们没有定义Debug1\n"); //程序段2
#endif
}
#ifndef用法与上述代码类似,这里不再举例说明。
2、用条件编译指令调试程序bug。
我们在日常工作在开发程序的时候,经常需要进行程序调试,打印调试信息,以便查缺补漏。但是等到程序完成将要上线的时候,我们就需要将这个程序中的调试语句逐一删除。那么利用条件编译指令就能很容易将调试信息或语句。请看下面代码:
#include <stdio.h>
#define Debug1 1
#if Debug1==1
//显示调试信息
#define Log(format,...) printf(format,##__VA_ARGS__)
#else
//不显示调试信息
#define Log(format,...)
#endif
int main(int argc, char* argv[])
{int X=7;
//Debug1==1打印信息
//Debug1==0不打印信息
Log("变量X的值-->%d\n",X);
return 0;
}
宏定义Debug1为1时,可以打印信息,既执行Log("变量X的值-->%d\n",X);此时的Log(format,...) 就是printf函数。如果我们改Debug1为0,则不打印信息,就是说,此时的Log(format,...)宏定义的值为空。这样我们就可以随心所欲的添加调试信息了。