1
C语言程序设计
1.8.8.3 7.8.3 条件编译——#if、#ifdef、#ifndef

7.8.3 条件编译——#if、#ifdef、#ifndef

一般情况下,源程序中所有的行都要经过编译。但有时希望对其中一部分内容在满足一定条件时才进行编译,这就是条件编译。

条件编译预处理命令通过测试常数表达式或标识符,以决定把哪一部分程序传送给编译器,以及哪一部分程序在预处理时取消编译。

条件编译有如下三种形式:#if、#ifdef、#ifndef。

1.#if条件编译

#if预处理命令的一般形式是:

img610

其作用是,当指定的常数表达式为真时就编译程序段1,否则就编译程序段2。这样可以事先给定条件,使程序在不同的条件下执行不同的功能。程序段可以是语句组,也可以是预处理命令。

例7-16 使用#if~#endif条件编译命令的程序。

程序如下:

img611

这里,MAX被定义为10,不满足判定条件,所以#if后的这段程序不被编译,而编译#else后的程序段,程序运行结果是显示出“compiled for small array”。需要注意的是,由于#if后的表达式是在编译时求值,因此它只能是由事先已定义过的宏替换名的常量组成,而不能使用变量。#endif用来标志#if程序段的结束,对于一个#if只能有一个#endif与其配对使用。

像C语句中的if~else语句一样,#else也可省略。因此#if预处理命令可表示为:

img612

例7-17 使用#if~#endif条件编译命令的程序。

程序如下:

img613

运行结果:

  compiled for array greater than 99 elements

2.#ifde f条件编译

  #ifdef预处理命令的一般形式是:

img614

其作用是,预处理程序遇到#ifdef命令时,判定标识符是否被定义过,如果是,则编译程序段1,否则编译程序段2。同样#else部分也可以省略,即为:

img615

条件编译对于提高C语言源程序的通用性很有好处,例如,图形显示的颜色是由图形适配器的种类和选取的工作模式确定的。当使用EGA图形适配器时最多可同时在屏幕上显示16种颜色,而使用PGA图形适配器可显示256种颜色。使用如下的条件编译可以方便地实现对图形适配器的选择:

  #ifdef EGA

  #define color_size 16

  #else

  #define color_size 256

  #endif

如果EGA在前面已被定义过,则编译下面的命令行:

  #define color_size 16

否则,编译下面的命令行:

  #define color_size 256

这样,当显示硬件环境变化时,源程序不必进行较大的修改就可以用于不同类型的彩色显示系统中。

3.#ifndef条件编译

img616

其作用是,如果标识符未被定义,则编译程序段1,否则编译程序段2,这种形式与前一种形式的作用刚好相反。

例7-18 使用#ifdef和#ifndef的例子。

程序如下:

img617

运行结果:

  currency is dollar

  france can’t be used

该程序运行结果是,如果定义了USA,则显示使用货币为“dollar”的信息,否则显示使用货币为英磅“pound”的信息。由于FRANCE未被定义,因此显示出法朗“france”不能使用的信息。

常见的编程错误7.1

img618 最好不使用已被用做全局变量的名称作为局部变量的名称。

img619 忘记静态局部变量只初始化一次,包含静态局部变量的函数被调用时,静态局部变量能保持上次被调用时的值。

img620 忘记内层变量屏蔽同名外层变量的规定。

img621 不恰当地定义过多的寄存器变量。