- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
吴梅红 厦门大学计算机科学系 C语言程序设计 厦门大学本科生公共课 第7章 编译预处理 7.0 预处理命令 7.1 宏定义 7.2 条件编译(*) 7.3 文件包含 7.4 多文件组织 7.0 预处理命令 ? 预处理命令:以”#”开头的命令; ? 预处理命令不是C语言的组成部分,但也是由ANSI C统一规定的,为 了区别于一般的C语句,规定预处理命令必须从新的一行开始, 以”#”开头,以回车符结束。 ? 预处理命令不能被编译程序识别,必须在编译之前由专门的预处理程 序进行转换。 ? 现在的C编译系统一般都包括预处理、编译和链接等部分,C编译系 统对C源程序的一般处理过程是: – 首先,运行预处理程序扫描源代码,对源程序中的预处理命令进行转换 和处理; – 然后,运行编译程序,把源程序编译成目标代码; – 最后,运行链接程序,把目标代码链接成可执行文件。 ? C语言提供了宏定义、文件包含、条件编译等多种预处理功能,有效 扩展了C语言程序设计的环境,减少程序设计和维护工作量,增强程 序可读性。 7.1 宏定义 ? 7.1.1 不带参数的宏 ? 7.1.2 带参数的宏 ? 7.1.3 取消宏定义 宏提供了一种文本替换机制,C语言中用预处理命令#define定义宏。 宏定义有不带参数和带参数两类,不带参数的宏定义实现简单文本替 换,带参数的宏定义具有类似函数的功能。 7.1.1 不带参数的宏 ? 定义形式: #define 标识符 [字符序列] 例如:#define PI 3.14159 ? 标识符就是宏的名字,字符序列可以为空,也可以是一串字符,用于 在预处理时替代宏名,称作替换文本;标识符与字符序列之间应当用 1个以上的空格或制表符隔开。 ? 预处理时,预处理程序把源程序中出现在宏定义之后的所有宏名逐一 替换成相应的替换文本,这样的替换过程成为“宏扩展”或“宏替 换”。 例如:s=PI*r*r; 经过预处理被替换成:s=3.14159*r*r; 使用宏的好处: ? 提高程序的可读性,描述性的宏名有助于更好地理解对应的替换文本 的含义和用途; ? 可以减少程序中同一个常量的重复书写,并方便对该变量的修改。 7.1.1 不带参数的宏 注意: (1)宏定义只能以“回车”结束,预处理程序将宏定义中从宏名之后的第一 个非空白字符开始到换行符之前的所有字符作为替换文本。 (2)如果宏定义超过一行,可以在该行行末加一个反斜杠”\”来续行。例如: #define LONG_STRING this is\ not a very long string (3)如果在字符常量、字符串和注释中出现宏名,则不做扩展。例如: #define HI hello 语句printf(“HI”);输出的仍然是HI,而不是hello。 (4)允许嵌套使用宏,即一个宏名可以出现在另一个宏的替换文本中。例如: #define X 5 #define Y X+1 #define Z Y*X 例子:a=Z;逐层替换:a=Y*X; →a=X+1*5; → a=5+1*5; (5)尽管宏名也是一个标识符,但它不是变量,不分配内存空间,因此,不 能作为变量使用。 (6)宏定义中可以没有替换文本,例如:#define EMPTY 这种宏定义通常作为条件编译检测的一个标志。 7.1.2 带参数的宏 ? 定义形式: #define 标识符(参数表) [字符序列] ? 参数表是一系列由逗号分隔的标识符,这些标识符的作用与C语言函 数中形参类似;标识符与括号”(”之间不能有空格。 ? 定义带参数的宏后,在后继的源程序中可以采用如下的类似函数调用 带参数的宏: 宏名(实参表) 例如:#define MULT(a,b) a*b 在后继程序中可以用下面语句调用该宏: printf(“%d\n”,MULT(1+2,3+4)); ? 宏替换分两步: – 首先,用宏定义中的替换文本替换整个宏调用; – 然后,将替换文本中出现的各个形参分别用宏调用中对应的实参 替换。 则上面的语句被替换为: printf(“%d\n”,1+2*3+4); 7.1.2 带参数的宏 ? (1)函数调用时,先对实参表达式求值,然后把实参的 值赋给形参;而调用带参数宏时,只是进行单纯的文本替 换。 例如: printf(“%d\n”,MULT(1+2,3+4)); 为了保证宏扩展后表达式运算的正确性,有时需要对形式参数加括 号或对整个替换文本加括号。 例如:#define MULT(a,b) ((a)*(b)) ? (2)函数调用时,要求实
您可能关注的文档
- ()数据完整性2016(共28页)资料.pptx
- (17三15钟炜等)如何发挥骨干教师在校本研修工作中的引领作用(校本新讲座三之15)-副本资料.ppt
- (152号文件附件)机电提升系统专项整治活动排查表(表格)资料.doc
- (2014秋开学)人教版物理九年级全册第十五章+电流和电路+单元测(含)资料.doc
- (2015年)豆制品废水处理设计方案资料.doc
- (2016届)学前教育专业毕业班毕业论文通知资料.doc
- (DCS)版新能源ETS技术协议资料.doc
- (STRUTS2.3.4+SPRING3.2+HIBERNATE4.1.1)SSH框架整合包括JAR包详解资料.pdf
- (XX项目)商品房买卖合同补充协议资料.doc
- (安全监察部)9.14资料.doc
最近下载
- 日立牌SET-FREE AⅢ系列产品提案书20240628.docx VIP
- AquaECO特灵产品技术手册20231212.pdf VIP
- 中考语文成语易错48道选择题(有详细解析).pdf VIP
- 天津钢管集团股份有限公司.pdf VIP
- 海尔物联多联MAX样册2025-4-10.pdf VIP
- 2023年小升初语文专项练习《地名人名拼写规则》(含答案).docx VIP
- 辅警结构化面试题及答案(2025年.docx VIP
- SET-FREE AⅢ产品样册-日立.pdf VIP
- 105656-海尔智慧楼宇检测中心概况(实验室布局,测试能力范围,实验室介绍,数字化测试,实验室认证).docx VIP
- 井控考试试题库(DOC) .pdf VIP
文档评论(0)