1
C/C ++程序设计
1.2.10.3 10.3 条件编译

10.3 条件编译

何谓“条件编译”,简单说就是“程序的内容指定编译的条件”。在编写程序的时候,通常源程序的所有代码行都会编译,但是在某些情况下,仅希望编译部分代码行时,就需要使用条件编译。条件编译有以下三种形式。

(1)#ifdef形式

例如:

#ifdef 标识符

程序段1

#else

程序段2

#endif

它的作用是若标识符已经被定义,则对程序段1进行编译,否则编译程序段2。但也可以不写#else,如下所示:

#ifdef 标识符

程序段

#endif

其中的“标识符”是用#define指令定义的,程序段可以是单行语句,也可以是多行语句。这种条件编译对于提高C程序的通用性有很大的好处。比如,一个C程序可以在某种配置的计算机上运行,也可以在另一台配置不同的机器上运行,只需要设置好不同的编译条件就可以。而有的机器一个整数类型int使用16位表示,而有的机器使用32位表示一个整数,使用条件编译只需对程序稍作改动,就可以增加程序的通用性,代码如下所示。

img366

把上述条件编译指令加载到程序中,如果程序在条件编译指令之前定义了COMPUTERSIZE16,则定义标识符INTEGER表示16,否则表示32。

(2)#ifndef形式

例如:

#ifndef 标识符

程序段1

#else

程序段2

#endif

这种形式的条件编译与第一种是一样的,只是ifdef替换成了ifndef,即如果标识符没有被定义过就会编译程序段1,否则就编译程序段2。也可以不写#else,如下所示:

#ifndef 标识符

程序段

#endif

(3)#if形式

例如:

#if表达式

程序段1

#else

程序段2

#endif

这种格式与if…else…执行过程类似。如果#if所指定的表达式的值非零,就编译程序段1,否则编译程序段2。与前两种形式不同的是,此处需要先定义表达式,而前面两种情况需要定义宏。

【例10.5】使用条件编译和函数式宏定义,求两个数中的大数和小数。

代码如下:

img367

img368

运行结果如图10-5所示。

img369

图10-5

分析:

上述代码略显复杂,其实就做了这么一些工作:当定义了MAX时,输出较大值;当没有定义MIN时,输出较小值;当没有定义MAX时,输出较小值;当定义了MIN时,输出较大值。