wmh-C语言设计-第7章-编译预处理论述.pdf

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 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)函数调用时,要求实

文档评论(0)

1112111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档