二级C语言考试辅导教程第九章:预处理[1]

二级C语言考试辅导教程第九章:预处理[1],第1张

二级C语言考试辅导教程第九章:预处理[1],第2张

第九章:预处理
预处理
概述
在前面的章节中,以“#”开头的预处理命令被多次使用。例如命令# include、宏定义命令# define等。在源程序中,这些命令放在函数之外,一般放在源文件的前面。它们被称为预处理部分。

所谓预处理,是指编译第一次扫描(词法扫描和语法分析)之前所做的工作。预处理是C语言的一个重要功能,由预处理器来完成。编译源文件时,系统会自动引用预处理器对源文件的预处理部分进行处理,处理后自动进入源文件的编译。

c语言提供了多种预处理功能,如宏定义、文件包含、条件编译等。合理利用预处理函数编写的程序易于阅读、修改、移植和调试,也有利于模块化程序设计。本章介绍了几种常见的预处理函数。

宏定义
在C语言源程序中,允许用一个标识符来表示一个字符串,称为宏。定义为“宏”的标识符称为“宏名”。在编译预处理过程中,程序中出现的所有宏名都被替换为宏定义中的字符串,这称为宏替换或宏扩展。

宏定义是由源程序中的宏定义命令完成的。宏替换由预处理程序自动完成。在C语言中,“宏”可以分为参数型和无参数型两种。下面讨论这两个“宏”的定义和调用。资料来源:www.examda.com

无参数宏定义
宏名后无参数。其定义的一般形式是:#define identifier string,其中“#”表示这是一个预处理命令。任何以“#”开头的命令都是预处理命令。“定义”是一个宏定义命令。“标识符”是定义的宏名。“字符串”可以是常数、表达式、格式字符串等。前面介绍的符号常数的定义是不带参数的宏定义。此外,程序中重复使用的表达式通常是宏定义的。比如:# define M (y*y+3*y)定义M表达式(y*y+3*y)。写源程序时,所有(y*y+3*y)都可以用M代替,而编译源程序时,预处理器会用(y*y+3*y)表达式代替所有宏名M,然后编译。
# define M(y * y+3 * y)
main(){
int s,y;
printf("输入一个数字:");
scanf("%d ",& y);
s = 3 * M+4 * M+5 * M;
printf("s=%d\n ",s);
}
在上面的示例程序中,首先定义了宏,定义了表达式M (y*y+3*y),在s = 3 * m+4 * m+5 * m中调用宏,预处理时宏展开后,语句变成:s = 3 *(y * y+3 * y)+4(y * y+3 * y)+5(y * y+3 * y);但需要注意的是,宏定义中表达式(y*y+3*y)两边的括号不能少。否则,将会出现错误。
如下定义:#difine M y*y+3*y展开宏会得到如下语句:s = 3 * y * y+3 * y+4 * y+3 * y+5 * y * y+3 * y;这相当于;3y 2+3y+4y 2+3y+5y 2+3y;明显不符合原意要求。当然,计算结果是错误的。因此,我们必须高度重视宏观定义。应该确保宏替换后不会出现错误。对于宏定义,应说明以下几点:

1.宏定义就是用宏名表示一个字符串,在宏展开时用字符串替换宏名。这只是一个简单的替换。字符串可以包含任何字符,可以是常量或表达式,预处理程序不会检查它。如果有错误,只能在编译被宏展开的源程序时才能发现。

2.宏定义不是描述或陈述,所以不需要在行尾加加号。如果添加了分号,它将被替换为分号。

3.宏定义必须写在函数之外,它的作用范围是宏定义命令起到绑定源程序的作用。要终止它的作用域,可以使用# undef命令,例如:# define pi 3.14159
main()
{
}
# unde pipi的作用域
f1()
4。如果源程序中的宏名用引号括起来,预处理程序不会用宏来代替它。
# define OK 100
main()
{
printf(" OK ");
printf(" \ n ");
}
上面例子中定义的宏名OK表示100,但是在printf语句中OK是用引号括起来的,所以没有进行宏替换。程序的运行结果是:OK,这意味着“OK”被当作一个字符串。

5.宏定义允许嵌套,定义的宏名可以在宏定义的字符串中使用。当宏被展开时,它被预处理程序逐层替换。例如:# define pi 3.1415926
# define pi * y * y/* pi是定义的宏名*/Pair语句:printf("%f ",s);宏替换后变成:printf("%f ",3.1415926 * y * y);

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 二级C语言考试辅导教程第九章:预处理[1]

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情