- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第8章 编译预处理 C 语言程序设计 第八章 编译预处理 编译预处理:在源程序文件中,加入“编译预处理命令”。使编译程序在对源程序进行通常的编译之前,先对这些特殊的命令进行“预处理”,然后将预处理的结果和源程序一起再进行通常的编译处理,以得到目标代码(.obj文件)。 所有编译预处理命令都是以“#”打头,单独占源程序中的一行,一般放在源程序的首部。 合理地使用预处理功能编写的程序便于阅读、修改、移植和调试,也有利于模块化程序设计。 源文件 *.c 运行文件 *.exe 目标文件 *.obj 编译 连接 编译预处理 编 译 第八章 编译预处理 8.1 宏定义 8.2 文件包含 8.3 条件编译 第八章 编译预处理 宏定义的作用是用标识符来代表一串字符。 一旦进行了宏定义,在程序中就可以用相应的标识符 代表该串字符。 C编译系统在编译之前将程序中的标识符替换成字符 串,这称为宏展开。 宏定义是由源程序中的宏定义命令来完成的。宏展开 是由预处理程序自动完成的。 8.1 宏定义 #define 标识符 字符串 宏定义的功能: 在进行编译前,用字符串原样替换程序中的宏名。 这个替换过程称为“宏替换”或“宏展开”,字符串也称为替换文本。 格式: 1. 不带参数的宏定义 例如: #define PI 3.14159 用标识符PI来代替3.14159 8.1 宏定义 例如: #define PI 3.14 main() { float r,s,c; scanf(“%f”,r); s = r * r * PI; printf(“s=%.2f”,s); } 替 换 3.14 8.1 宏定义 说明: 1)宏名要符合标识符的命名规则,通常采用大写。 2)宏定义使用宏名代替一个字符串,只是做简单的置换,并不做正确性检查。只有宏展开后,程序进行编译时才进行语法检查。 3)宏定义不是C语句,在行尾不用加分号。如果加了分号,会将分号看成字符串的一部分,一起置换。 8.1 宏定义 4)宏定义语句出现在程序中函数的外面,宏名的有效范围为宏定义命令之后到源文件结束。可以使用#undef命令来提前终止宏名的作用域。例如:PI的有效范围 #define PI 3.14159 main() { ……} #undef PI del() {……} #undef PI的功能是使PI的作用范围到这一行结束,因此在del函数中PI就不能再代表3.14159了。 8.1 宏定义 PI的有效范围 5)宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换。 例如: #define MIN 100 main() { printf(MIN=%d,MIN); } 前面的MIN在引号里面,不替换,后面的MIN要替换,所以输出结果为:MIN=100 8.1 宏定义 格式: 2. 带参数的宏定义 #define 宏名(形参表) 字符串 功能: 在编译预处理时,把源程序中所有带参数的宏名用宏定义中的字符串替换,并且用宏名后圆括号中的实参替换字符串中的形参。 带参宏的调用格式: 宏名(实参表) 8.1 宏定义 例如: #define L(a,b) 2*(a+b); 宏定义,其中的a、b是形参 length=L(2,3); 宏调用,其中的2、3是实参 length=2*(2+3); 带参宏定义的宏展开:按#define语句中指定的字符串 从左到右替换。如果字符串中包含宏中指定的形参 (如a、b),则将程序语句中相应的实参(2、3)值 传递过去。如果宏定义中的字符串中的字符不是参数 字符(如2*(a+b)中的2、*、+等),则保留。 8.1 宏定义 【例8-2】 带参宏定义的应用示例。 #define PI 3.14159 #define L(r) 2*PI*r main() { float a,length; a=5.5; length=L(a); /*宏展开为:2*3.14159*5.5*/ printf(r=%.2f\nlength=%.2f\n,a,length); } 程序运行结果: r=5.50 length=34.56 8.1 宏定义 说明: 1)带参宏的展开只是将语句中的宏名后面括号内的实参字符串代替#define命令行中的形参。 例1:宏定义:#define S(a,b) a*b 宏调用:c=S(2+3,3+4) 宏展开后的语句:c=2+3*3+4 最终c的值为15 例2:宏定义:#define S(a,b) (a)*(
文档评论(0)