C语言与其它高级语言的一个重要区别就是可以使用预处理命令和具有预处理的功能。为了与一般的C语句相区别,这些命令都以符号#开头。
C语言提供的预处理功能主要有以下3种:宏定义、文件包含和条件编译。
在对程序进行通常的编译之前,必须先对程序中这些特殊的命令进行“预处理”。即根据预处理命令,对程序作相应的处理。
经过预处理后,程序就不再包括预处理命令了,最后再由编译程序对预处理后的源程序进行通常的编译处理,得到可供执行的目标代码。
关于宏定义的几点说明:
(1) 宏定义可以出现在程序的任何位置。一般写在函数的外面,位于文件的开头。
(2)宏名的有效范围是从定义处开始到本文件结束。但可以用#undef命令终止宏定义的作用域。示例代码如下:
#define N 1000
int main()
{ …
#undef N
…
}
由于“#undef”的作用,使得N的作用范围在“#undef”处终止。
(3) 不要在宏定义的行末加分号。因为加分号后,会将分号也作为字符串的组成部分,宏展开后可能出现错误。
(4) 宏定义是用宏名代替一个字符串,凡在宏定义有效范围内的宏名都用该字符串代替。但要注意:在双引号内与宏名相同的字符串不认为是宏名,不进行替换。
例如下面代码段:
# define PI 3.14159
…
printf("PI ");
执行上面程序段将显示PI,而不是3.14159。
(5) 可以引用前面已经定义过的宏名来定义新的宏,如下所示:
#define N 1000
#define M N+200
#define K 3*N+4*M+M/2
这里要注意的是:K展开是3*1000+4*1000+200+1000+200/2,不要以为是3*1000+4*(1000+200)+(1000+200)/2。除非前面的定义是“#define K 3*N+4*(M)+(M)/2”。
有时定义宏可能特意增加括号,这样宏展开时候不容易出错。

