- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第11章 预处理11.1宏定义目录 CONTENT11.2入口文件11.3条件编译11.1 宏定义宏定义是最常用的预处理功能之一。对于预处理器而言,其在遇到宏定义之后,会将随 后在源代码中出现的宏名进行简单的替换操作。11.1.1 define 与 undef宏定义指令以#define 开头,后面跟随宏名和宏体,其语法格式如下所示。 上述操作等同于为指定的宏体起别名,新名称为宏名。为了和其他变量以及关键字进行 区分,宏定义中的宏名一般由全大写英文字母以及下划线组成。具体示例如下所示。上述宏定义中定义了一个标识符 PI,它所代表的值是 3.14。预编译时在随后的源代码 中凡是出现了 PI 的地方都会被替换为 3.14,这个过程称为宏展开。 注意:宏定义不是 C 语句,不需要在末尾加分号。在编写程序时通常将所有的#define 放在文 件的开始处或独立的文件中,而不是将其分散到整个程序中。11.1.1 define 与 undef#define 的使用如例 11-1 所示。分析:如上述示例中,第 7行代码输出 PI 的值,由于 PI 已经被#define 定义为 3.14,输出值为 3.140000。11.1.1 define 与 undef除了#define 之外相应地还有#undef 指令。#undef 指令用于取消宏定义。在#define 定义 输出: 分析: 一个宏后,如果预处理器在接下来的源代码中遇到了#undef 指令,则从#undef 之后该宏将 不再存在。如例 11-2 所示。分析: 如上述示例中,第 9 行代码通过#undef 取消宏 PI,PI 将无任何意义。因此,第 10 行代 码输出宏 PI 的值时,显示宏未定义。11.1.2 不带参数的宏定义宏定义分为不带参数的宏定义和带参数的宏定义,在 11.1.1 节中,使用#define 指令完 成简单的字符替换工作就属于不带参数的宏定义,两者的区别在于是否有参数列表,本节将 介绍不带参数的宏定义的其它用法。使用宏定义可替换表达式以及字符串,具体如例 11-3 所示。分析:如上述示例中,第 3 行代码使用宏 PLUS 替换表达式。第 4 行代码使用宏 STR 替换字 符串。第 8、9 行代码分别输出宏对应的值。由输出结果可知,在 C 语言中,使用宏可替换 字符串以及表达式。11.1.3 带参数的宏定义除了无参数的宏定义之外,有的程序更希望能够使用带参数的宏定义,从而在完成替换 的过程中会有更多的灵活性,其语法格式如下所示。带参数宏定义的操作如例 11-4 所示。分析:如上述示例中,第 4 行代码使用宏 CIR()替换表达式,该宏属于带参数的宏,其值取决 于传入的参数。对于带参数的宏定义,在预处理过程中首先会将参数替换进宏定义中,再用 输出: 分析: 输出: 分析: 替换参数后的宏定义在源代码中做替换。第 9 行代码使用 CIR(r),则在第 4 行代码的宏定义 中,将参数 x 换为 r,宏定义 CIR(r)的值为 2*PI*r,由于嵌套了宏定义 PI,则最终经过预处 理之后,宏定义 CIR(r)的值为 2*3.14*r。11.1.3 带参数的宏定义带参宏的参数不同于函数中的参数,带参宏的参数只是简单的替换,因此将一个表达式 传递给带参宏,如果不加括号的话,很有可能会出现问题,如例 11-5 所示。分析: 如上述示例中,第 3行代码使用带参数宏 S(i)计算参数值的乘积。第 6 行代码输出带参 数宏的值,传入的参数为 2+2,由于带参数宏的参数仅仅是简单的替换,因此最终宏的计算 结果为 2+2*2+2=8。而程序的本意是计算(2+2)*(2+2),符号*的优先级大于符号+,导致程序 计算错误。 综上所述,在使用带参数的宏定义时,需要根据实际情况,使用括号来保护表达式中低 优先级的操作符,以确保调用时达到想要的效果。11.1.3 带参数的宏定义注意:在宏定义时,宏名与带参数的括号之间不能加空格,否则会将空格之后的字符都作为替代字符串的一部分。在带参数宏定义中,形式参数不分配内存空间,因此不必做类型定义。从程序功能的角度看,带参数的宏可以实现某些函数的功能,一定程度上可以替代一些函数定义,但宏定义本身与函数存在本质的区别,具体如下。(1) 宏定义会在编译器在对源代码进行编译时,完成简单地替换,不会进行任何逻辑检测。(2)宏定义时不考虑参数的类型。(3)参数宏的使用会使具有同一作用的代码块在目标文件中存在多个副本,即会增长输出:分析:目标文件的大小。(4)参数宏的运行速度会比函数快,因为不需要执行参数压栈/出栈操作。(5)函数只在目标文件中存在,比较节省程序空间。(6)函数的调用会牵扯到参数的传递,压栈/出栈操作,速度相对较慢。(7)函数的参数存在传值和传地址(指针)的问题
您可能关注的文档
- 数据新闻 第5章 数据分析和可视化工具.pptx
- 数据新闻 第6章 其他数据新闻制作工具.pptx
- 《短视频策划、拍摄与制作》教学课件第1章短视频概述.pptx
- Altium Designer 19 电子线路板设计与制作PPT课件(共6章)第1章概述.pptx
- Altium Designer 19 电子线路板设计与制作PPT课件(共6章)第2章稳压电源电路的制图与制板.pptx
- Altium Designer 19 电子线路板设计与制作PPT课件(共6章)第3章人体感应灯电路的制图与制板.pptx
- Altium Designer 19 电子线路板设计与制作PPT课件(共6章)第4章抢答器电路的制图与制板.pptx
- Altium Designer 19 电子线路板设计与制作PPT课件(共6章)第5章3D打印机主控板的制图与制板.pptx
- Altium Designer 19 电子线路板设计与制作PPT课件(共6章)第6章电子秤仪表的制图与制板.pptx
- C语言程序设计PPT课件(共13章)第1章C 语言概述.pptx
原创力文档


文档评论(0)