- 1、本文档共5页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C语言程序设计_李鸿_编译预处理
第九章 编译预处理
编译指令(编译预处理指令):C源程序除了包含程序命令(语句)外,还可以使用各种编译指令(编译预处理指令)。编译指令(编译预处理指令)是给编译器的工作指令。这些编译指令通知编译器在编译工作开始之前对源程序进行某些处理。编译指令都是用“#”引导。
编译预处理:编译前根据编译预处理指令对源程序的一些处理工作。C语言编译预处理主要包括宏定义、文件包含、条件编译。
编译工作实际分为两个阶段:编译预处理、编译。广义的编译工作还包括连接。
9、1 宏定义
宏定义:用标识符来代表一个字符串(给字符串取个名字)。C语言用“#define”进行宏定义。C编译系统在编译前将这些标识符替换成所定义的字符串。
宏定义分为不带参数的宏定义和带参数宏定义。
不带参数宏定义(简单替换)
1、不带参数宏定义格式: 其中:标识符-宏名。
2、宏调用:在程序中用宏名替代字符串。
3、宏展开:编译预处理时将字符串替换宏名的过程,称为宏展开。
#define PI 3.14
main()
{
float r=3,s,c;
s=PI*r*r; c=2*PI*r;
printf(r,s,c);
}
main()
{
float r=3,s,c;
s=3.14*r*r; c=2*3.14*r;
printf(r,s,c);
}
例如:
说明:
宏名遵循标识符规定,习惯用大写字母表示,以便区别普通的变量。
#define之间不留空格,宏名两侧空格(至少一个)分隔。
宏定义字符串不要以分号结束,否则分号也作为字符串的一部分参加展开。从这点上看宏展开实际上是简单的替换。
例如:#define PI 3.14; 展开为s=3.14;*r*r;(导致编译错误)
宏定义用宏名代替一个字符串,并不管它的数据类型是什么,也不管宏展开后的词法和语法的正确性,只是简单的替换。是否正确,编译时由编译器判断。
例如:#define PI 3.I4 照样进行宏展开(替换),是否正确,由编译器来判断。
#define宏定义宏名的作用范围从定义命令开始直到本源程序文件结束。可以通过#undef终止宏名的作用域。
#define E 2.71828
main()
{
fun();
printf(“%f”,E);
}
#undef E
#define E “abc”
fun()
{
char *s=E;
printf(“%s\n”,s);
}
#deine PI 3.14
#define R 3.0
#define L 2*PI*R
#define S PI*R*R
main()
{ printf(“L=%f,S=%f”,L,S);
}
宏定义中,可以出现已经定义的宏名,还可以层层置换。
宏名出现在双引号“”括起来的字符串中时,将不会产生宏替换。(因为出现在字符串中的任何字符都作为字符串的组成部分)
宏定义是预处理指令,与定义变量不同,它只是进行简单的字符串替换,不分配内存。
使用宏的优点:
程序中的常量可以用有意义的符号代替,程序更加清晰,容易理解(易读)。
常量值改变时,不要在整个程序中查找,修改,只要改变宏定义就可以。比如,提高PI精度值。
带参数宏定义比函数调用具有更高的时间效率,因为相当于代码的直接嵌入。(空间效率:多次调用占用空间较多,一次调用没有什么影响)。
带参数宏定义
带参数宏定义不只是进行简单的字符串替换,还要进行参数替换。
带参数宏定义的格式:
例如:
#define S(a,b) a*b
其中S-宏名,a,b是形式参数。程序调用S(3,2)时,把实参3,2分别代替形参a,b。
area=S(3,2); = area=3*2;
带参数宏定义展开规则:
在程序中如果有带实参的宏定义,则按照#define命令行中指定的“字符串”从左到右进行置换(扫描置换)。如果串中包含宏定义中的形参,则将程序中相应的实参代替形参,其它字符原样保留,形成了替换后的字符串。
注意:还是一个字符串的替换过程,只是将形参部分的字符串用相应的实参字符串替换。
例9-1:用带参数宏定义表示两数中的较大数
#define MAX(a,b) (ab)?a:b
main()
{
int i=15,j=20;
printf(“MAX=%d\n”,MAX(i,j));= printf(“MAX=%d\n”,(ij)?i:j);
}
注意:
(1)正因为带参宏定义本质还是简单字符替换(除了参数替换),所以容易发生错误。
例如:
#define S(a,b) a*b
程序中area=S(a+b,c+d);=area=a+b*c+d;明显和我们的意图不同。
假如:宏定义的字符串中的形参用()括
文档评论(0)