条件编译
件编译命令可以使得编译器按不同的条件去编译程序不同的部分,产生不同的目标代码文件。也就是说,通过条件编译命令,某些程序代码要在满足一定条件下才被编译,否则将不被编译。
常用的条件编译命令有如下三种格式:
9.3.1 格式一
#ifdef 标识符
程序段1
#else
程序段2
#endif
其中,ifdef、else和endif都是关键字。程序段1和 程序段2是由若干预处理命令和语句组成的。它的功能是,如果标识符已被 #define命令定义过,则对程序段1进行编译;否则对程序段2进行编译。本格式中的#else也可以没有:
#ifdef 标识符
程序段
#endif
面是使用这种条件编译命令的一个例子:
例9-8 | |
| |
在此程序中因为加入了条件编译预处理命令,因此要根据TIME是否被#define语句定义过,来决定编译哪一个cout语句。如果定义过,则编译"cout<<"Now begin to work"<<endl;"语句,否则则编译"cout<<"You can have a rest"<<endl;"语句。本例TIME已经定义过,所以输出的结果为:
Now begin to work
格式一的流程图表示如下:
图9-5 | |
本格式中的#else也可以没有:如果没有"#else",则流程图如下:
图9-6 | |
9.3.2 格式二 #ifndef 标识符
程序段1
#else
程序段2
#endif
格式二和格式一形式上的的区别在于ifdef关键字换成了ifndef关键字,其功能是:如果标识符未被#define命令定义过,则对程序段1进行编译, 否则对程序段2进行编译,这与格式一的功能正好相反。例如:
#ifndef NULL
#define NULL ((void *)0)
#endif
本段代码能够保证符号NULL只有一次定义为((void *)0)。
格式二的流程图表示如下:
图9-7 | |
9.3.3 格式三 #if 常量表达式
程序段1
#else
程序段2
#endif
if、else和endif是关键字。程序段1、程序段2都是由若干条预处理命令和语句组成。它的功能是:如常量表达式的值为真(true),则对程序段1 进行编译,否则对程序段2进行编译。因此可以使程序在不同条件下,完成不同的功能。
举例如下:
例9-10 | |
| |
在这个例子中,如果常量表达式R为真,则编译语句:
r=3.14159*c*c;
cout<<"area of round is:"<<r<<endl;
否则则编译语句:
s=c*c;
cout<<"area of square is"<<s<<endl;
由于在宏定义中, R定义为1,因此在条件编译时,常量表达式的值为真,故将计算并输出圆面积。事实上,上面介绍的条件编译完全可以用if-else条件语句来实现。 但是用条件语句将会对整个源程序进行编译,生成的目标代码程序比较长,而采用条件编译,则根据条件,只编译其中的程序段1或程序段2,生成的目标程序较短。如果条件选择的程序段很长,采用条件编译的方法无疑是有用的。
仅仅有#if和#else指令只能进行两种情况的判断, C++还提供了#elif指令,其意思即为"else if",它与#if和#else指令一起就构成了if-else-if嵌套语句,用于多种编译选择的情况。其格式一般形式为:
#if 常量表达式1
程序段1
#elif 常量表达式2
程序段2
#elif 常量表达式3
程序段3
…
#else
程序段n+1
#endif
下面举个例子说明#elif指令的用法:
例9-11 | |
| |
图9-8 | |