第六章 C预处理程序
源程序在编译前要进行“预处理”
预处理主要完成以下功能:1.宏替换
2.文件包含
3.条件编译
一、宏替换
1)简单的宏替换
#define PI 3.14159265336
……
double area(radius)
double radius;
{
return(PI*radius*radius);
}
ps:由“#”开始的命令是C预处理程序处理的命令
#define是宏的定义命令,其一般形式为:#define P a
表示要把源代码中出现在该行之后的每一个P都用a来代替。
说明:1、宏定义必须定义在第一次使用该宏之前
2、宏定义不是以分号结束的
3、#define P a 之间至少要有一个空格
4、P为宏,a为宏扩展
5、宏名用大写字母表示(习惯)
6、宏的好处:a)简化书写
b)提高可读性
c)便于修改
d)提高可移植性
7、预处理程序将不替换字符串中用单引号或双引号括起来的字符常量的宏
#define HELLO “bonjour\n”
#define A ‘B’
main()
{ 预处理替换为:
prntf(HELLO); prntf(“bonjour\n”);
printf(“%c\n”,A); printf(“%c\n”,‘B’);
}
运行结果:bonjour
B
以上程序若改为:
#define HELLO bonjour
#define A B
main()
{
prntf(“HELLO\n”);
printf(“%c\n”,‘A’);
}
因为为字符常量,所以不替换
运行结果:HELLO
A
8、前面定义的宏名,在后面的#define中可以被引用
2)带有参数的宏替换
宏替换一定要看成字符串(字符串不能计算)
#define N 2
#define M N+1
#define NUM (M+1)*M/2
NUM 的值为:(M+1)*M/2 =(N+1+1)*N+1/2 =(2+1+1)*2+1/2 =8
宏定义:#define 宏名(参数表) 字符串
注意:字符串中要包含参数表中指定的参数
经C预处理(cpp.ex)的宏替换可由cpp text.c type test.i查看
宏调用:宏名(实参表)
注意:1、宏定义中的“宏名”和“(参数表)”之间不能有空格
2、定义有参数的宏替换时,要用圆括号将宏扩展括起来,避免误算
3、带参数的宏调用和函数调用的区别:a)宏调用在编译前,函数调用在编译后