1.1.6 编译预处理
通常在C编译系统对程序进行编译前,先对程序中一些特殊的命令进行“预处理”,然后将预处理的结果和源程序一起进行编译处理,得到目标代码。
1. 宏定义
(1) 不带参数的宏定义
用一个指定的标识(即名字)来代表一个字符串,它的一般形式如下:
如:
指定用标识符PI来代替字符串“3.1415926”,以后程序中如果出现PI,则它表示“3.1415926”。
这里需要注意的有以下几点。
± 宏名一般用大写字母表示,便于与变量名相区别。
± 宏定义不是C语句,结尾不必加分号。
± 通常#define命令写在文件开头,位于函数之前,作为文件的一部分,在此文件范围内有作用。
± 对程序中用双引号括起来的字符串内的字符,即使与宏名相同,也不作替换。
± 进行宏定义时,可以引用已定义的宏名,可以层层置换。
(2) 带参数的宏定义
除了进行简单的字符串替换外,还要进行参数替换,它的一般形式如下:
如:
#define add(x,y) x+y
z=add(7,8);/*此句在函数内部*/
|
带参数的宏与函数非常类似,在引用函数时也是在函数名后的括号内写实参,且要求实参的数目等于形参。但它们还是有区别的。
± 对参数的使用方法不一样。函数调用时,先求出实参表达式的值,然后带入形参;宏只进行简单的字符替换。
± 处理机制不一样。函数调用在程序运行时处理,且要分配内存;宏展开在编译时进行,不分配内存单元,不发生值的传递处理,也不存在返回值。
± 定义时的要求不一样。函数定义时,实参和形参都要定义类型;宏定义时不存在类型问题。
下面以一个实例来结束宏的学习。
【代码1-13】
/*输入一个圆的半径,求出它的面积*/
#include "stdio.h"
#define PI 3.1415926
#define area(r) PI*r*r
main()
{
float r,a;
scanf("%f",&r);
a=area(r);
printf("The area is %f",a);
}
|
2. 文件包含语句
在文件包含语句中,一个源文件可以将另外一个源文件的全部内容包含进来,其一般形式如下:
如:
此时被包含的文件stdio.h与其所在的文件在预编译之后组成同一个文件。对被包含文件的修改将影响到其所在的文件。