文档介绍:第12章编译预处理
了解编译预处理
宏定义
文件包含
条件编译
了解编译预处理
C语言所提供的“编译预处理”功能是它区别于其他高级语言的又一重要特征,其主要功能包括三种:宏定义、文件包含和条件编译,分别由三种命令来实现。为了区别于C语句,预处理命令必须出现在一行的开始并以“#”号打头。
宏定义
宏定义由#define命令实现,根据实际应用的需要可以分为不带参数的宏定义和带有参数的宏定义两种命令形式。
不带参数的宏定义
命令的一般形式为:
#define 标识符字符串
定义中的“标识符”称为“宏名”。这一命令的作用仅仅是表明用指定的宏名来代替一个指定的字符串。例如:
#define PI 3 .1415926
它的作用是指定用宏名PI来代替“3 .1415926”这个字符串。在预编译时,程序中所有出现“宏名”的地方,都将由这个字符串的内容进行替换,此过程称为“宏展开”。
说明
(1)不带参数的宏定义常常被用于定义符号常量。这样既可以提高程序的通用性,也便于修改。
用宏名限定数组的大小。
#define N 10
/* 定义宏名N */
void ArrIn(int a[])
{ int i;
for(i=0; i<N; i++)
/* 为N个元素赋值*/
scanf("%d",&a[i]);
}
main( )
{ int x[N];
/* 定义有N个元素的数组*/
ArrIn(x);
…
}
以上是我们在编程中常用的方法:首先利用宏定义指定用N代表字符串10;所以主函数中定义的数组大小是10;函数ArrIn中读入的元素个数也是10。当需要改变数组大小时,只需改动#define命令行,而不用改动程序的其他部分。
(2)宏展开时系统不作语法检查,若定义不当,要待编译展开源程序时,才会引发错误。
例如:
#define PI
main( )
{ float s, r=;
s=PI*r*r;
printf("s=%f\n",s);
}
程序中在定义代表值的宏名PI时,。这一宏定义命令本身并不构成错误。因为宏名PI代表的是字符串“”,而不是数值。但在程序中引用了宏名PI来计算圆面积,赋值语句:
s=PI*r*r;
经宏展开后变为:
s=*r*r;
从而导致编译出错。虽然出错位置在此赋值语句,但引发这一错误的根源还是上述宏定义命令。