黑马程序员——C语言日志——条件编译指令

 ------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,...)宏定义的值为空。这样我们就可以随心所欲的添加调试信息了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值