8.4 条件编译指令

在默认情况下,源程序中的所有程序代码都要进行编译,但是有时需要某些语句行在条件满足的情况下才进行编译,此时便用到条件编译指令。目前商业软件公司广泛应用条件编译来制作某个程序的不同用户的版本,例如专业版、个人版、试用版等,从而可以限制软件的某些功能。

条件编译指令是指对源程序的代码有选择地进行编译。采用条件编译,可以提高程序的广泛适用性,缩小目标源代码的大小,加快程序执行的速度。C51的条件编译指令有#if、#else、#ifdef、#ifndef、#endif等几个命令,下面分别介绍这些命令的用法。

8.4.1 #if、#else和#endif命令

if、#else和#endif命令是一组常用的条件编译指令,用于进行条件编译,其一般形式如下。


if常量表达式

语句段;

else

语句段;

endif


其中,“#if”、“#else”、“#endif”为条件编译指令,“常量表达式”为进行条件编译的判断条件,语句段为进行条件编译的程序代码段。

条件编译指令的执行过程为,先判断常量表达式的值,如果值为真,则编译表达式后紧跟的语句段;如果值为假,则编译#else命令后面的语句段。#endif命令表示一个条件编译的结束。使用条件编译指令的程序示例如下。


include<stdio.h>//头文件

define SCORE 55//宏定义变量

void main()//主函数

{

if SCORE>=60//开始条件汇编

printf(“You have passed the exam!\n”);

else

printf(“You haven't passed the exam!\n”);

endif//条件编译结束

}


该程序可以在KeilµVision3集成开发环境中运行,其结果如下所示。


You haven't passed the exam!


本例中,使用条件编译指令执行输出语句,进行条件编译的判断条件为宏定义的宏名的值是否满足大于等于60,根据判断的结果,选择执行语句。

在使用#if、#else、#endif条件编译指令时,应注意以下几点。

❑作为判断语句的#if后面的常量表达式,必须含有常量或已定义过的标识符,不可使用变量。

❑条件编译的结束指令#endif后面没有分号“;”。

❑常量表达式不能含有sizeof操作符。

❑作为判断语句的#if后面的常量表达式的值,必须在编译时就可以得到,所以这个表达式不能是程序运行时才执行的表达式。