09 第九节 预处理.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
09 第九节 预处理

第九章 编译预处理 编译预处理 所谓编译预处理是指,在对源程序进行编译之前,先对源程序中的编译预处理命令进行处理;然后再将处理的结果,和源程序一起进行编译,以得到目标代码。 编译工作实际分为两个阶段:编译预处理、编译。广义的编译工作还包括连接。 头文件的应用 在多模块应用程序的开发上,经常使用头文件组织程序模块。 头文件成为共享源代码的手段之一。程序员可以将模块中某些公共内容移入头文件,供本模块或其它模块包含使用。比如,常量,数据类型定义。 头文件可以作为模块对外的接口。比如,可以供其它模块使用的函数、全局变量声明。 头文件常常包含如下内容: 用户定义的常量 用户定义的数据类型 用户模块中定义的函数和全局变量的声明。 头文件的应用举例 (1)文件print_format.h #define PR printf #define NL \n #define D %d #define D1 D NL #define D2 D D NL #define D3 D D D NL #define D4 D D D D NL #define S %s 宏定义:用标识符来代表一个字符串(给字符串取个名字)。 C语言用“#define”进行宏定义。 C编译系统在编译前将这些标识符替换成所定义的字符串。 宏定义分为不带参数的宏定义和带参数宏定义。 说明 (1)宏名遵循标识符规定,习惯用大写字母表示,以便区别普通的变量。 (2)#define之间不留空格,宏名两侧空格(至少一个)分隔。 (3)宏定义字符串不要以分号结束,否则分号也作为字符串的一部分参加展开。从这点上看宏展开实际上是简单的替换。 例如:#define PI 3.14; 展开为s=3.14;*r*r;(导致编译错误) 带参数宏定义 带参数宏定义不只是进行简单的字符串替换,还要进行参数替换。 注意,参数替换过程是字符串的替换过程,只是将形参部分的字符串用相应的实参字符串替换。 带参数宏定义 例:求圆的面积: S=? r 2 带参数宏定义 #define S(a,b) a*b 程序中area=S(a+b,c+d);=area=a+b*c+d;明显和我们的意图不同。 假如:宏定义的字符串中的形参用()括号括起来,即: #define S(a,b) (a)*(b) 此时程序中: area=S(a+b,c+d);=area=(a+b)*(c+d);符合我们的意图。 带参数宏定义 定义带参数宏时还应该注意宏名与参数表之间不能有空格。有空格就变成了不带参数的宏定义。 如:#define S (r) PI*r*r area=S(3.0); = area=(r) PI*r*r(3.0); 带参数的宏 与 函数 的区别 带参数的宏定义在程序中使用时,它的形式及特性与函数相似,但本质完全不同。区别在下面几个方面: 函数调用,在程序运行时,先求表达式的值,然后将值传递给形参;带参宏展开只在编译时进行的简单字符置换。 函数调用是在程序运行时处理的,在堆栈中给形参分配临时的内存单元;宏展开是在编译时进行,展开时不可能给形参分配内存,也不进行“值传递”,也没有“返回值”。 函数的形参要定义类型,且要求形参、实参类型一致。宏不存在参数类型问题。 如:程序中可以MAX(3,5)也可以MAX(3.4,9.2) 许多问题可以用函数也可以用带参数的宏定义 宏占用的是编译时间,函数调用占用的是运行时间。在多次调用时,宏使得程序变长,而函数调用不明显。 * * 编译预处理 本章目标 1.全面了解#include的含义 2.进一步掌握#define定义的内容 3.理解条件编译 编译预处理 连接 编译 宏定义 文件包含 条件编译 ? 预处理的意义:简化程序、开发大程序 预处理的作用: ? 提高可移植性 ? 提高可读性 预处理的方式:在编译之前 编译预处理 一、#include的作用 预处理指令#include(文件包含) 将#include后面所指定文件一份拷贝替换这条指令。 ? #include文件名 如:stdlib.h, myfun.c 一、#include的作用 文件放在标准目录中 ? #include文件名 文件放在当前目录中或者标准目录中 文件名 一般以h或c作为后缀名 例: 文件f1.c的内容为: 预编译后: ? 再进行正式编译 预编译 供其它模块共享 提供声明,使其它模块产生正确调用格式 (好象一个接口) (2)文件file1.c #include print_format.h“ main() { int a,b,c,d; char string[] = CHINA; a = 1; b = 2; c = 3; d = 4; PR(D1,a); PR(D2,a,b);

文档评论(0)

rachel + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档