- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第12章 编译预处理 12.1 了解编译预处理 12.2 宏 定 义 12.3 文 件 包 含 12.4 条 件 编 译 12.1 了解编译预处理 C语言所提供的“编译预处理”功能是它区别于其他高级语言的又一重要特征,其主要功能包括三种:宏定义、文件包含和条件编译,分别由三种命令来实现。为了区别于C语句,预处理命令必须出现在一行的开始并以“#”号打头。 12.2 宏 定 义 宏定义由#define命令实现,根据实际应用的需要可以分为不带参数的宏定义和带有参数的宏定义两种命令形式。 12.2.1 不带参数的宏定义 命令的一般形式为: #define 标识符 字符串 定义中的“标识符”称为“宏名”。这一命令的作用仅仅是表明用指定的宏名来代替一个指定的字符串。例如: #define PI 3 .1415926 它的作用是指定用宏名PI来代替“3 .1415926”这个字符串。在预编译时,程序中所有出现“宏名”的地方,都将由这个字符串的内容进行替换,此过程称为“宏展开”。 说明 (1)不带参数的宏定义常常被用于定义符号常量。这样既可以提高程序的通用性,也便于修改。 例12.1 用宏名限定数组的大小。 #define N 10 /* 定义宏名N */ void ArrIn(int a[]) { int i; for(i=0; iN; i++) /* 为N个元素赋值 */ scanf(%d,a[i]); } main( ) { int x[N]; /* 定义有N个元素的数组 */ ArrIn(x); … } 以上是我们在编程中常用的方法:首先利用宏定义指定用N代表字符串10;所以主函数中定义的数组大小是10;函数ArrIn中读入的元素个数也是10。当需要改变数组大小时,只需改动#define命令行,而不用改动程序的其他部分。 (2)宏展开时系统不作语法检查,若定义不当,要待编译展开源程序时,才会引发错误。 例如: #define PI 3.141592b main( ) { float s, r=2.5; s=PI*r*r; printf(s=%f\n,s); } 程序中在定义代表?值的宏名PI时,将字符串3.1415926中的数字6误写作了字母b。这一宏定义命令本身并不构成错误。因为宏名PI代表的是字符串“3.141592b”,而不是数值。但在程序中引用了宏名PI来计算圆面积,赋值语句: s=PI*r*r; 经宏展开后变为: s=3.141592b*r*r; 从而导致编译出错。虽然出错位置在此赋值语句,但引发这一错误的根源还是上述宏定义命令。 (3)宏展开时,不对双引号括起来的字符串中的内容进行替换。如有定义: #define PI 3.14159 语句:printf(PI=%f\n,PI);中有2个PI,第一个PI是在双引号内的,它不被替换;第二个PI在双引号外,它将被展开成3.14159。 (4)在#define命令行中可以没有“字符串”,即表示成: #define 标识符 如: #define DEBUG 这里仅仅是为了表明标识符DEBUG已经“被定义”。这种定义形式在条件编译中将会用到。 (5)为了与变量名相区别,一般习惯用大写字母作宏名。但这不是规定,只是约定俗成。 12.2.2 带参数的宏定义 1.定义形式 #define 宏名(形参表) 字符串 例如: #define CYC(r) 2*3.14159*r 说明 (1)这里定义了一个计算圆周长的宏CYC(r),宏名CYC与其后的左括号之间不得留有空格,否则CYC将被视为不带参数的宏。 (2)作为替换文本的字符串中应含有括号中的参数,如2*3.14159*r中的r。否则,就没有必要定义带参数的宏。 (3)字符串中可以包含已经定义过的宏名。例如: #define CR \n #define D %d #define PRI D CR 则语句:printf(PRI, 20);执行后的输出结果为:20。 2.宏展开的过程 程序中若调用了带参数的宏,预编译时不仅仅是进行简单的字符串替换,还涉及到参数的替换。宏展开的过程是:按命令行中指定的字符串从左到右进行置换,遇到形参则以实参代替,对于非参数字符则原样保留。若有语句: x=CYC(2.5); 宏展开时将用实参2.5替换字符串“2*3.14159*r”中的形参r,其他字符不变。置换后的语句为: x=2*3.14159*2.5; 说明 (1)由于宏定义是在预编译时展开的,它不具有任何计算功能。宏展开时,若实参是一个表达式,也是原样置换,而不进行求值。如有语句: y=CY
您可能关注的文档
- C语言程序设计基础 作者 马华 李玉娟 第9章 文件.ppt
- C语言程序设计教程 第2版 普通高等教育“十一五”国家级规划教材 作者 李丽娟 C第2版(第2章_基本语句).ppt
- C语言程序设计教程 第2版 普通高等教育“十一五”国家级规划教材 作者 李丽娟 C第2版(第4章_分支结构).ppt
- C语言程序设计教程 第2版 普通高等教育“十一五”国家级规划教材 作者 李丽娟 C第2版(第5章_循环结构).ppt
- C语言程序设计教程 第2版 普通高等教育“十一五”国家级规划教材 作者 李丽娟 C第2版(第7章_数组).ppt
- C语言程序设计教程 第2版 普通高等教育“十一五”国家级规划教材 作者 李丽娟 C第2版(第8章_指针).ppt
- C语言程序设计教程 第2版 普通高等教育“十一五”国家级规划教材 作者 李丽娟 C第2版(第9章_结构).ppt
- C语言程序设计教程 第2版 普通高等教育“十一五”国家级规划教材 作者 李丽娟 C第2版(第10章_文件).ppt
- C语言程序设计教程 第2版 普通高等教育“十一五”国家级规划教材 作者 李丽娟 C第2版(第11章_位运算).ppt
- C语言程序设计教程 第2版 宗大华 陈吉人 C语言 课件-1.ppt
最近下载
- 2025年中国邮政集团有限公司吉林省分公司校园招聘笔试模拟试题及完整答案详解.docx VIP
- 2024年《汽轮机本体检修》职业技能鉴定知识考试必备题库及答案(共190题).docx VIP
- (名师原创)《我能行》主题班会.ppt VIP
- 2022年初中物理培优(竞赛)及高中自主招生专题训练:第02章声现象(含解析).pdf VIP
- 三式簿记和收益动量 (美)伊尻雄治著娄尔行译.pdf VIP
- 华荣QJZ-2×□SF煤矿风机用隔爆兼本质安全型双电源真空电磁起动器.doc
- 《嗨,你好》幼儿园小班课程PPT课件.pptx VIP
- 2025年中国邮政集团有限公司吉林省分公司校园招聘笔试模拟试题及答案解析.docx VIP
- 可穿戴设备在睡眠数据采集中的应用.pptx VIP
- AI人工智能软件使用课件.pptx VIP
文档评论(0)