C语言程序设计第6章编译预处理.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
华中科技大学计算机学院C语言课程组 C语言与程序设计 The C Programming Language 第6章 编译预处理 编译预处理:对源程序进行编译之前所作的工作,它由预处理程序负责完成。编译时,系统将自动引用预处理程序对源程序中的预处理指令进行处理。 预处理指令:以“#”号开始的指令。 本章重点介绍: #include、#define和条件编译的功能和用法,以及assert宏的使用。 6.1 文件包含#include 用指定文件的内容取代该预处理指令行,有2种一般形式: (1) #include 文件名 在指定的标准目录下寻找被包含文件 (2) #include 文件名 首先在用户当前目录中寻找被包含文件, 若找不到,再在指定的标准目录下寻找 6.2 宏定义#define 用一个标识符来表示一个字符串, #define 标识符 字符串 宏名:被定义的标识符。在编译预处理时, 宏代换(宏展开):用字符串去取代宏名 6.3 带参数的宏定义 #define 标识符(标识符,标识符,…,标识符) 字符串 例 定义计算x2的宏 #define square (x) ((x)*(x)) 宏调用:square (a+1) 宏展开: ((a+1) * (a+1)) 宏调用:square (square (a)) 宏展开:( (((a)*(a))) * (((a)*(a))) ) 为什么要这么多的括号? 考虑 :#define SQ(x) x*x 宏调用: SQ(a+b) 宏展开:a+b*a+b /* 与(a+b)*(a+b)不同 */ 再考虑 :#define SQ(x) (x)*(x) 宏调用: 27/SQ(3) 宏展开:27/(3)*(3) /* 值27, 与 27/32 不同 */ 定义带参数的宏时,为了保证计算次序的正确性,表达式中的每个参数用括号括起来,整个表达式也用括号括起来。 注意:宏名和与左括号之间不能有空格 #define SQ (x) ((x)*(x)) 被认为是无参宏定义 。 宏调用:SQ(3) 宏展开:(x) ((x)*(x)) (3) /*显然错误的*/ 带参的宏虽被认为不安全,但还是很有价值 #define SQ(x) ((x)*(x)) 宏调用:SQ(++a) 宏展开: ((++a)*(++a)) /*a加2次 如是函数调用,将不会有问题 */ 宏节省了函数调用的开销,程序运行速度更快,形式参数不分配内存单元,不必作类型说明。但是,宏展开后使源程序增长。 宏比较适合于经常使用的简短表达式,以及小的可重复的代码段;当任务比较复杂,需要多行代码才能实现时,或者要求程序越小越好时,就应该使用函数。 6.2.3 空宏参数 C99允许宏调用中任意或所有参数为空。例如: #define ADD(x,y) (x+y) /* 定义两数相加的宏 */ x = ADD(2,3); y = ADD(,3); /* 第1个参数为空*/ 预处理后变为: x = (2+3); /* x的值为5 */ y = (+3); /* y的值为3 */ 6.2.4 可变参数宏定义 C99增加了可变参数宏(variadic macros),允许像下面这样定义可变参数宏: #define debug(format, ...) printf (format, __VA_ARGS__) debug是一个可变参数宏,format是宏的一个参数,省略号代表一个能够改变的参数表,在每次被调用时,“…”被表示成零个或多个参数。内建的预处理器标识符__VA_ARGS__ 用来把“…”部分传递给宏。当宏的调用展开时,实参就取代__VA_ARGS__。例如,宏调用 debug(x= %d\n,y=%d\n,10,20); /* 输出 x=10,y=20 */ 会被展开成: printf(x= %d\n,y=%d\n,10,20); 【例6.2】 用C99的可变参数宏, 打印调试信息。 在编写代码的过程中,为了调试程序,经常会输出一些调试信息到屏幕上,随着项目的调试,输出的信息可能会越来越多,信息的输出一般要调用printf等函数。但是,当调试完后,又需要手工将这些地方删除或者注释掉。这样做工作量比较大,很麻烦。 如何方便地处理这

文档评论(0)

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

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

1亿VIP精品文档

相关文档