文档介绍:第8章预处理命令
《C语言程序设计》
课程讲义
2006年4月
上一章节课程回顾
函数定义的一般形式
函数的参数和函数的值
函数的调用
函数的嵌套调用
函数的递归调用
数组作为函数参数
局部变量和全局变量
变量的存储类别
第8章预处理命令
概述
宏定义
文件包含
条件编译
编译预处理:在源程序文件中,加入“编译预处理命令”,使编译程序在对源程序进行通常的编译(包括词法分析、语法分析、代码生成、代码优化)之前,先对这些命令进行预处理,然后将预处理的结果和源程序一起再进行通常的编译处理,以得到目标代码(OBJ文件)。
C提供的编译预处理命令
宏命令(Macro)
文件包含命令(include)
条件编译命令
这些命令均以#开头,以区别于语句。
宏(Macro)定义
一、不带参数的宏
一般形式: #define 标识符字符串
如: #define PI
作用:用标识符(称为“宏名”)PI代替字符串“”。
在预编译时,将源程序中出现的宏名PI替换为字符串“”,这一替换过程称为“宏展开”。
#define:宏定义命令
#undef:终止宏定义命令
[例]
PI
main()
{
float l,s,r,v;
printf("input radius:");
scanf("%f",&r); /* 输入圆的半径*/
l = *PI*r; /* 圆周长*/
s = PI*r*r; /* 圆面积*/
v = *PI*r*r*r; /* 球体积*/
printf("l=%\ns=%\nv=%\n",l,s,v);
}
关于宏定义的说明:
1、一般宏名用大写字母表示。(变量名一般用小写字母)。
2、使用宏可以提高程序的可读性和可移植性。如上述程序中,多处需要使用π值,用宏名既便于修改又意义明确。
3、宏定义是用宏名代替字符串,宏扩展时仅作简单替换,不检查语法。语法检查在编译时进行。
4、宏定义不是C语句,后面不能有分号。如果加入分号,则连分号一起替换。
如:
#define PI ;
area = P*r*r;
在宏扩展后成为:
area = ;*r*r;
结果,在编译时出现语法错误。
5、通常把#define命令放在一个文件的开头,使其在本文件全部有效。(#define定义的宏仅在本文件有效,在其它文件中无效,这与全局变量不同)。
6、宏定义终止命令#undef结束先前定义的宏名。
#define G
main()
 {
 }
#undef G /* 取消G的意义*/
f1()
   ┆
7、宏定义中可以引用已定义的宏名。
[]
#define R
#define PI
#deinfe L 2*PI*R
#define S PI*R*R
main()
{
printf("L=%f\nS=%f\n",L,S);
}
8、对程序中用双引号括起来的字符串,即使与宏名相同,也不替换。例如上例的printf语句中,双引号括起来L和S不被替换。
二、带参数的宏
一般形式:
#define 宏名(参数表) 字符串
带参数的宏在展开时,不是进行简单的字符串替换,而是进行参数替换。例、