- 1、本文档共40页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第8章 编译预处理 第8章 编译预处理 8.1 结构体类型的概述 8.2 宏定义 8.3 文件包含 8.4 条件编译 8.1 编译预处理命令 1. 编译预处理 2. 编译预处理命令 1. 编译预处理 预处理由专门的预处理程序负责完成。 当对一个源文件进行编译前,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。中间不需要人为干预。 编译预处理是由编译系统中的预处理命令进行的 C语言提供了多种预处理功能,如文件包含、宏定义、条件编译等。 2. 编译预处理命令 编译预处理命令主要有三种,即:宏定义、文件包含、条件编译。 所有的编译预处理命令均以#符号开头,各占用一个单独的书写行,末尾不用分号作结束符。 编译预处理命令可以出现在程序的任何位置,其作用域是自出现的地方开始直到源程序的末尾。 8.2 宏定义 8.2.1无参宏的定义 8.2.2带参数宏的定义 8.2.3宏替换与函数调用的区别 8.2.4宏定义的解除和重新定义宏 8.2.1无参宏的定义 所谓无参宏就是宏名后不带任何参数。其定义的一般形式为: #define 宏名 字符串(或数值) 其中的“#”表示这是一条预处理命令, C语言中凡是以“#”开头的命令都为预处理命令。 “define”为宏定义命令。 宏定义在使用中应注意以下几点: (1)宏名的前后应有空格。 (2)宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名 。 (3)宏定义命令其后不要跟分号。 (4)字符串(或数值)中如果出现运算符号,则要注意替换后的结果,通常可以在合适的位置加上括号。 ?例8.1?宏应用举例。 #define N (8*x+x*x) /*定义N来替代表达式(8*x+x*x)*/ main() { int s,x; printf(please input a number: ); scanf(%d,x); s=5*N+6*N+7*N; /*宏调用*/ printf(s=%d\n,s); } 分析:上例程序中首先进行宏定义,定义N来替代表达式(8*x+x*x),在s=5*N+6*N+7*N中对N进行了宏调用。经宏展开后该语句变为下面的形式: s=5*(8*x+x*x)+6*(8*x+x*x)+7*(8*x+x*x); 如果在宏定义中表达式(8*x+x*x)两边的括号没有了,预处理时将会变成: s=5*8*x+x*x+6*8*x+x*x+7*8*x+x*x; 显然发生了错误,因此加括号和不加括号的意思和答案完全不一样。所以在进行宏定义时必须十分注意。应保证在宏代换之后不发生错误。 (5)宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用 # undef命令。 例如图8-1所示: (6)C语言规定,宏名如果出现在字符串常量中或者用双引号括起来的字符串内时,将不作为宏名处理,不对其进行宏替换。例如: #define PI 3.14159 float r=1.0; … printf(”s=PI*r*r=%f\n”,PI*r*r); 则程序运行时,输出结果是: s=PI*r*r=3.14159*1.0*1.0=3.141590 而不是: s=3.14159*r*r=3.14159*1.0*1.0=3.141590 ?例8.2?宏名出现在双引号内部时的应用举例。 #define OK 800 /*定义OK来替代表达式800*/ main() { printf(OK); /*宏名位于双引号内进行输出*/ printf(\n); } 程序的运行结果是: OK 而不是800,因为双引号中的宏名不不作宏名处理,没有进行宏替换。 (7)宏定义允许嵌套,在宏定义的字符串(或数值)中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换。 例如: #define PI 3.14159 #define S PI*r*r /* 其中的PI是已定义的宏名*/ … printf(%f,S); 在宏代换后变为: printf(%f,3.14159*r*r); (8)习惯上宏名用大写字母表示,以便与变量区别。但也可以用小写字母,用大写字母不是规定,只是一种习惯。建议用大写字母表示宏名。 (9)对“输出格式”作宏定义,可以减少书写麻烦。 ?例8.3?对输出格式作宏定义应用举例。 #define P printf /*定义P来替代printf*/ #define D %d\n /*定义D来替代%d\n*/ #define F %f\n /*定义F来替代%f\n*/ main() { int a=7, c=32, e=20;
您可能关注的文档
最近下载
- 常见肿瘤分期手册第八版中文版.pdf VIP
- 中南15ZJ201《平屋面》( Word 可编辑版).docx
- 汉语言文学毕业自我鉴定(通用17篇).pdf VIP
- 退休人员派遣劳务合同8篇.docx VIP
- 《新时代劳动教育实践指导手册(四年级下册)》 《劳动快乐,我爱劳动》【四年级下册】(1)劳动价值观培养+(2)日常劳动我来干.pptx VIP
- 中职英语基础模块2(高教版)教案:Unit3-Internship(全6课时).doc
- 副总经理招聘面试题及回答建议(某大型央企).docx VIP
- 2024年智能建造技术.pptx
- 钢结构的安装PPT课件.ppt VIP
- 倪海厦--伤寒论.doc
文档评论(0)