C/C++条件编译
通常,源文件中所有内容都要参加编译,但是在某些时候,可能希望源文件中某些部分在
满足某些条件的情况下才进行编译,这就是所谓的“条件编译”。条件编译非常有用,许
多学习C++的人在最开始的时候往往会忽略它,因为没有它我们的程序照样运行的很好。要
注意,对于一些小型的程序,可能条件编译的作用常常被掩盖,但是当程序的规模变大后
条件编译的作用和优势就会显现出来了。因此把握它还是非常重要的。
条件编译有以下三种形式:
1:
#ifdef 标识符
程序片段1
#else
程序片段2
#endif
上述语句的意思就是如果标识符已被#define命令定义过,则对程序片段1进行编译;否则
对程序片段2进行编译。其中,程序片段2可以为一个空的程序段,那么#else就没有什么
实际的意义了,这时可以将其省略。下面看这段示例代码。
#include <iostream>
#define DEBUG
using namespace std;
void main()
{
#ifdef DEBUG
cout << "Begin..." << endl;
#else
cout << "Cannot Begin!" << endl;
#endif
int array[10];
for(int i = 0;i < 10;i++)
{
array[i] = i;
#ifdef DEBUG
cerr << "i = " << i << endl;
cerr << "array[i] = " << array[i] << endl;
#endif
}
}
2:
#ifndef 标识符
程序片段1
#else
程序片段2
#endif
形式2和形式1的区别在于#ifdef关键字换成了#ifndef关键字,其功能是如果标识符未被
#define命令定义过,则对程序片段1进行编译;否则对程序片段2进行编译,这与形式1的
功能正好相反。
3:
#if 标识符
程序片段1
#else
程序片段2
#endif
该形式完成的功能是如果表达式的值为真,则对程序片段1进行编译;否则对程序片段2
进行编译。因此可以使程序在不同条件下完成不同的功能。
条件编译还常用于防止包含于头文件中的类或者函数被被重复定义多次。在一个程序中
多次包含某个头文件会导致类和函数的重定义问题。可以通过使用条件编译来防止该问
题的发生。下面看这段代码。
#if !defined(_POINT_H_)
#define _POINT_H_
class Point {
// .....
};
#endif
上述例子中,条件编译指示#if被用于检查程序是否定义了标识符_POINT_H_。如果没
有被定义,那么例子中余下的源码将会被处理;否则如果它已经被定义过了,那么预
处理程序就会跳过这段代码。如果程序中的数个源码文件都包含该头文件了,那么条
件编译将确保该文件的内容仅被包含一次。文件被包含的第一次就使得条件#define
_POINT_H_为真,!define(_POINT_H_)为假,所以当文件被第二次包含时,该类不会
被重复定义。对包含类定义的头文件使用条件编译是个良好的编程习惯。