文档介绍:第7章编译预处理命令
2004年3月
河北建筑工程学院
编译预处理是C++编译系统的一个重要组成部分,它负责分析处理几种特殊的指令,这些指令被称为预处理命令。在C++源程序文件中,加入编译预处理命令,可以改进程序设计环境,提高编程效率。但它们不是C++语言的组成部分,不能直接对它们进行编译,编译系统在对源程序进行正式的编译之前,必须先对这些命令进行预处理,经过预处理后的程序不再包括预处理命令,然后由编译系统对预处理后的源程序进行通常的编译处理,得到可供执行的目标代码。
C++提供的预处理命令主要有以下三种:
  宏定义
  文件包含
  条件编译
这些命令均以#开头,每行一条命令,因为它们不是C++的语句,所以命令后无分号。
宏定义
宏定义分为两类:不带参数的宏定义和带参数的宏定义。
不带参数的宏定义
#define称为宏定义指令,它的一般格式为:
#define 标识符字符串
作用:用一个指定的标识符来代表一个字符串,字符串可以是常量、关键字、语句、表达式,还可以是空字符。
其中,标识符又称为宏名,字符串称为宏体。
编译预处理时,如果程序中出现宏定义命令,预处理程序就把该命令以后的程序中所有同宏名一致的标识符全部替换为所定义的宏体,这个过程称为“宏展开”。
例如:
#define PI
PI来代替字符串“”
※注意: 在预编译处理时,将程序中在该命令以后出现的所有的PI都用“”代替。
【】输入圆半径,求圆周长、圆面积、球体积。
#include <>
#define PI
void main()
{
double l,s,r,v;
cout<<"inputradius:"<<endl;
cin>>r;
l=2*PI*r;
s=PI*r*r;
v=*PI*r*r*r;
程序运行结果:
input radius: 6
l=
s=
v=
说明:
(1) 宏名一般用大写字母表示,以便与变量名相区别。
(2) 使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量,当需要改变某一个常量时,可以只改变#define命令行,做到一改全改,不容易出错
(3) 宏定义是用宏名代替一个字符串,在宏展开时只是作简单的字符串替换,并不对语法是否正确进行检查。
例如在输入下列宏命令时:
#define PI
将小数点“.”错写成了“,”,在编译预处理时也不会报错,只在编译时才会发现错误并报告错误。
(4) 宏定义不是C++语句,一定不要在行末加分号,如果加了分号,会将分号当成字符串的一部分进行替换。
(5) 通常把#define命令放在一个文件的开头,使其定义在本文件内全部有效,即作用范围从其定义位置起到文件结束。
(6) 可以使用#undef命令来取消宏定义的作用域。
#undef 命令的一般格式为:
#undef 宏名
它的作用是通知编译预处理系统取消前面由#define命令所定义的宏名,使其定义的宏名不再起作用。
例如:
#define PI
void main()
{ ……}
#undef PI
f1()
{ ……}
由于#undef的作用,使PI的作用范围在#undef行处终止,因此,在f1函数中,。这样可以灵活控制宏定义的作用范围。
(7) 宏定义允许嵌套定义,即在进行宏定义时,可以使用已定义过的宏名。
(8) 对程序中用双引号括起来的字符串内的字符,即使与宏名相同,也不进行替换
【】求半径为3的圆周长、圆面积和球体积。
#include <>
#define R 3
#define PI
#define L 2*PI*R
#define V *PI*R*R*T
void main()
{
cout<<"L="<<L<<"S="<<S
<<" V="<<V<<endl; }
程序运行结果:
L=
S=
V=
(9) 宏定义命令是专门用于预编译处理的,它与定义变量的含义不同,只作字符替换,不分配内存空间。
带参数的宏
这种宏不只是进行宏体的替换,还要进行参数的替换.
一般形式:
#define 宏名(形式参数表)字符串
字符串中包含了在形式参数表中所指定的参数
例如:
#define S(a,b) a*b
area = S(3,2) 得 3*2
【】计算圆面积
#include <