1.2 C++预处理
和C语言一样,C++预处理命令也有三种:宏定义命令、文件包含命令、条件编译命令。这些命令在程序中都是以“#”来引导的,每一条预处理命令必须单独占用一行,但在行尾不能有分号“;”。
1.2.1 宏定义命令
用#define可以定义一个符号常量,如:
#define PI 3.141593
这里的#define就是宏定义命令,它的作用是将3.141593用PI代替,PI称为宏名。需要注意的是:
(1) #define、PI和3.141593之间一定要有空格,且一般将宏名定义成大写,以便与普通标识符相区别。
(2) 宏被定义后,一般不能再重新定义,而只有当使用如下命令时才可以重新定义:
#undef 宏名
(3) 一个定义过的宏名可以用来定义其他新的宏。
(4) 宏还可以带参数,例如:
#define MAX(a,b) ((a)>(b)?(a):(b))
其中(a,b)是宏MAX的参数表,如果在程序中出现下列语句:
x = MAX(3, 9);
则预处理后变成:
x = (3>9?3:9); // 结果为9
很显然,带参数的宏相当于一个函数的功能,但却比函数简捷。
1.2.2 文件包含命令
所谓“文件包含”是指将另一个源文件的内容合并到源程序中。C/C++语言提供了#include命令用来实现文件包含的操作,它有如下两种格式:
#include <文件名> #include “文件名”
文件名一般以.h为扩展名,因而称它为“头文件”,如前面的程序例子中iostream.h是头文件的文件名。“文件包含”的两种格式中,第一种格式是将文件名用尖括号“< >”括起来的,用来包含那些由系统提供的并放在指定子目录中的头文件。第二种格式是将文件名用双引号括起来,用来包含那些由用户定义的放在当前目录或其他目录下的头文件或其他源文件。
1.2.3 条件编译命令
一般情况下,源程序中所有的语句都参加编译。但有时也希望根据一定的条件去编译源文件的不同部分,这就是“条件编译”。条件编译使得同一源程序在不同的编译条件下得到不同的目标代码。C/C++提供的条件编译命令有下列几种常用的形式:
格式1:
#ifdef <标识符> <程序段1> [ #else <程序段2> ] #endif
其中,#ifdef、#else和#endif都是关键字,<程序段>是由若干条预处理命令或语句组成的。这种形式的含义是:如果标识符已被#define命令定义过,则编译<程序段1>,否则编译<程序段2>。
格式2:
#ifndef <标识符> <程序段1> [ #else <程序段2> ] #endif
这与前一种形式的区别仅在于,如果标识符没有被#define命令定义过,则编译<程序段1>,否则就编译<程序段2>。
格式3:
#if <表达式1> <程序段1> [ #elif <表达式2> <程序段2> ] [ #else <程序段n> ] #endif
其中,#if、#elif、#else和#endif是关键字。它们的含义是,如果<表达式1>为“真”就编译<程序段1>;否则如果<表达式2>为“真”就编译<程序段2>,…;如果各表达式都不为“真”就编译<程序段n>。