设为首页 加入收藏

TOP

1.1.6 编译预处理
2013-10-10 22:53:26 来源: 作者: 【 】 浏览:97
Tags:1.1.6 编译 处理

1.1.6  编译预处理

通常在C编译系统对程序进行编译前,先对程序中一些特殊的命令进行“预处理”,然后将预处理的结果和源程序一起进行编译处理,得到目标代码。

1. 宏定义

(1) 不带参数的宏定义

用一个指定的标识(即名字)来代表一个字符串,它的一般形式如下:

#define 标识符 字符串

如:

#define PI 3.1415926

指定用标识符PI来代替字符串“3.1415926”,以后程序中如果出现PI,则它表示“3.1415926”。

这里需要注意的有以下几点。

± 宏名一般用大写字母表示,便于与变量名相区别。

± 宏定义不是C语句,结尾不必加分号。

± 通常#define命令写在文件开头,位于函数之前,作为文件的一部分,在此文件范围内有作用。

± 对程序中用双引号括起来的字符串内的字符,即使与宏名相同,也不作替换。

± 进行宏定义时,可以引用已定义的宏名,可以层层置换。

(2) 带参数的宏定义

除了进行简单的字符串替换外,还要进行参数替换,它的一般形式如下:

#define 宏名(参数表) 字符串

如:

#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. 文件包含语句

在文件包含语句中,一个源文件可以将另外一个源文件的全部内容包含进来,其一般形式如下:

#include "文件名"

如:

#include "stdio.h"

此时被包含的文件stdio.h与其所在的文件在预编译之后组成同一个文件。对被包含文件的修改将影响到其所在的文件。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇1.1.3 运算符和表达式 下一篇1.3 本 章 小 结

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: