在编译器对源程序进行编译之前,首先要由预处理器对程序文本进行预处理。预处理提供了一组编译预处理指令和预处理操作符。预处理指令实际上不是 C++ 语言的一部分,它只是用来扩充 C++ 程序设计的环境。所有的预处理指令在程序中都是以 “#”来引导,每一条预处理指令单独占用一行,不要用分号结束。预处理指令可以根据需要出现在程序的任何位置。
1、#include 指令
#include 指令也称为文件包含指令,其作用是将另一个源文件嵌入到当前源文件该点处。通常用 #include 指令来嵌入头文件。文件包含指令有如下两种格式。
- #include <文件名>
按标准方式搜索,文件位于系统目录下的 include 子目录下。 - #include “文件名”
首先在当前目录中搜索,若没有,再按标准方式搜索。
#include 指令可以嵌套使用。假设有一个头文件 myhead.h ,该头文件中又可以有如下的文件包含指令:
#include "file1.h"
#include "file2.h"
2、#define 和 #undef 指令
预处理器最初是为C语言设计的,#define 曾经在 C 程序中被广泛使用。但 #define 能完成的一些功能,能够被C++引入的一些语言特性很好的替代。
在C语言中,用 #define 来定义符号常量,例如下面的预编译指令定义了一个符号常量 PI 的值为 3.14:
#define PI 3.14
在C++中虽然仍然可以这样定义符号常量,但是更好的方法是在类型说明语句中用 const 进行修饰。
在C语言中,还可以用 #define 来定义带参数宏,以实现简单的函数计算,提高程序的运行效率,但是在C++中这一功能已经被内联函数取代。
用 #define 还可以定义空符号,例如:
#define MYHEAD_H
定义它的目的,仅仅是表示“MYHEAD_H 已经定义过”这样一种状态。将该符号配合条件编译指令一起使用,可以起到一些特殊作用,这是C++程序中 #define 的最常用之处。
#undef 的作用是删除由 #define 定义的宏,使之不再起作用。
3、条件编译指令
使用条件编译指令,可以限定程序中的某些内容要在满足一定条件的情况下参与编译。因此,利用条件编译可以使用一个源程序在不同的编译条件下产生不同的目标代码。例如,可以在调试程序时增加一些调试语句,以达到跟踪的目的,并利用条件编译指令,限定当程序调试好后,重新编译时,使调试语句不参与编译。常用的编译语句有下列