C++语言程序设计

最后，以两个综合性的编译预处理程序为例，让大家进一步学习怎样使用编译预处理命令。

| 例9-12

#include<iostream.h>
//将系统输入输出流头文件包含进来
void main( )
{
int B=5;
//定义了一个变量B，其值为5
#define B 2
//用简单宏定义定义了一个符号常量B
#define f(x) B*(x)
//用带参数的宏定义定义了一个宏f(x)
int y =3;
cout<<f(y+1)<<endl;
//在各种不同的情况下调用该宏
#undef B
//取消对符号常量B的宏定义
cout <<f(y+1)<<endl;
#define B 3
//再次用简单宏定义定义符号常量B
cout <<f(y+1)<<endl;
}

在这个程序里，虽然前后3次输出语句都是
cout<<f(y+1)<<endl;
"f(y+1)"在编译时候，被展开的结果也都是"B*(y+1)"，但是输出的值却每次都不一样。
第一次输出时，B是在语句"#define B 2"中定义的，在该符号常量的作用域（从定义点开始，到整个文件结束或者用#undef取消其定义为止）内， B被2替换，此时B*(y+1)的输出值为8。
第二次输出时，由于语句"#undef B"已经取消对符号常量B的宏定义，此时的B是一个变量，值为5，则在B*(y+1)输出值为20。
第三次输出时，语句"#define B 3"再次用简单宏定义定义符号常量B，B被3替换，此时B*(y+1)的输出值为12。

| 例9-13

# include <iostream.h>
#define T 1
//用简单宏定义定义了一个符号常量T
#define ABC void main ( )\
{cout<< "hello!"<<s<<end1;}
//用简单宏定义定义了一个符号常量ABC，
//这里因为一行写不下，用了续行符"\"
#include "abc.h"
//用文件包含命令将abc.h包含进来
其中，abc.h文件内容如下：
#if T
//如果常量表达式T的值为真，则编译下面的程序段
char s[]= "good morning!";
ABC
#endif
该程序中，使用了三种预处理命令。
该程序被替换结果如下（头文件iostream.h未替换）：
#include<iostream.h>
char s[]="good morning!";
void main ( )
{
cout << "hello!"<<s<<end1;
}

执行后输出结果如下：
hello! good morning!