- 1、本文档共15页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C语言程序设计ppt-第6章推荐
华中科技大学计算机学院 C语言程序设计 第6章 编译预处理 编译预处理:对源程序进行编译之前所作的工作,它由预处理程序负责完成。编译时,系统将自动引用预处理程序对源程序中的预处理指令进行处理。 程序员通过编译预处理命令规定编译器在编译前所作的工作。 预处理指令:以“#”号开始的指令。 6.1 文件包含#include 功能:用指定文件的内容取代该预处理指令行,有2种形式: (1) #include 文件名 在指定的标准目录下寻找被包含文件 (2) #include 文件名 首先在用户当前目录中寻找被包含文件, 若找不到,再在指定的标准目录下寻找 如:#include “stdio.h” #include “math.h” 6.2 宏定义#define 功能:用一个标识符来表示一个字符串.一般形式为: #define 标识符 字符串 宏名:被定义的标识符。宏代换(宏展开):在编译预处理时,用字符串去取代宏名 6.3 带参数的宏定义 #define 标识符(标识符,标识符,…,标识符) 字符串 例 定义计算x2的宏 #define SQ(x) ((x)*(x)) X:形式参数 宏调用:SQ(a+1) /*a+1为实参*/ 宏展开: ((a+1) * (a+1)) 实际上是用((x)*(x))代替SQ(x),用实参a+1代替形参X。 宏调用:SQ(SQ(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.4 取消宏定义#undef 终止宏名的作用域,其形式为: #undef 标识符 何时使用#undef指令? 防止宏名的冲突 #include everything.h #undef SIZE /*everything.h中定义了SIZE,就取消它; 否则该指令不起作用*/ #define SIZE 100 保证调用的是一个实际函数而不是宏 #undef getchar int getchar(void) {…} 6.5 条件编译 条件编译:在预处理中进行条件控制,根据所求条件的值有选择地包含不同的程序部分,因而产生不同的目标代码。 这对于程序的移植和调试是很有用的 。 条件编译指令三种形式,控制流与if-else语句类似。 见p172 表6.1 例 利用R计算圆或正方形的面积 预处理前 #define R /* #undef R*/ void main(void) { float c,r,s; printf (input a number: ); scanf(%f,c); #ifdef R r=3.14159*c*c; printf(use define: %f\n,r); #else s=c*c; printf(use undef %f\n,s); #endif } 6.6 assert宏
文档评论(0)