C++基础--条件编译

来源:互联网 发布:派克练字钢笔推荐 知乎 编辑:程序博客网 时间:2024/06/04 08:32
 

条件编译

件编译命令可以使得编译器按不同的条件去编译程序不同的部分,产生不同的目标代码文件。也就是说,通过条件编译命令,某些程序代码要在满足一定条件下才被编译,否则将不被编译。
  常用的条件编译命令有如下三种格式:
9.3.1 格式一
  #ifdef 标识符
   程序段1
  #else
   程序段2
  #endif
  其中,ifdef、else和endif都是关键字。程序段1和 程序段2是由若干预处理命令和语句组成的。它的功能是,如果标识符已被 #define命令定义过,则对程序段1进行编译;否则对程序段2进行编译。本格式中的#else也可以没有:
  #ifdef 标识符
   程序段
  #endif
面是使用这种条件编译命令的一个例子:

例题例9-8
#include <iostream.h>
#define TIME
void main()
{
 #ifdef TIME
  cout<<"Now begin to work"<<endl;
 #else
  cout<<"You can have a rest"<<endl;
 #endif
}
  在此程序中因为加入了条件编译预处理命令,因此要根据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
#include <iostream.h
#define R 1
main()
{
 float c,r,s;
 cout<<"input a number: "<<endl;
 cin>>c;
 #if R
 r=3.14159*c*c;
 cout<<"area of round is:"<<r<<endl;
 #else
 s=c*c;
 cout<<"area of square is"<<s<<endl;
 #endif
}
  在这个例子中,如果常量表达式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
#include<iostream.h>
#define A -10
void main( )
{
 #if A>0
 cout<< "a>0"<<endl;
 #elif A<0
 cout<<"a<0"<<endl;
 #else
 out<< "a= =0"<<end1;
 #endif
}
图示图9-8