C语言课件07_Preprocessing.pptVIP

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

编译预处理 预处理与编译过程图 编译程序不能识别预处理命令! 提纲 概述 宏定义 不带参数的宏 带参数的宏 取消宏定义 文件包含 练习 概述 预处理功能是由一些预处理命令组成的,这些命令是在程序正常编译之前被执行。 三种常用的预处理命令: 宏定义命令 条件编译命令 文件包含命令 预处理命令的特点: 是在正常编译之前执行的。 左边加一个#号,作为该命令的标志。 不是语句,该命令结束不加分号。 一般单独占一行。如写成多行,要加续行符(\)。 不带参数的宏(1) 作用:用一个指定的标识符来代表一个字符序列,也就是前面介绍的定义符号常量。 形式:#define 标识符 [字符序列] 标识符称为“宏名”,字符序列称为“替换文本”,上述形式称“宏定义”。 在预处理过程中将宏定义之后的所有宏名逐一替换成相应的替换文本,这一过程称为“宏展开”或 “宏替换”。 宏名一般习惯用大写字母表示。 使用宏可以提高程序的通用性。 不带参数的宏(2) 宏定义并不为宏名分配内存空间。 宏定义是用宏名代替一个字符序列,所以是作简单的置换,不作正确性检查。 宏定义不是C语句,不必在行末加分号,宏定义以“回车”结束。 在进行宏定义时,可以引用已定义的宏名,即允许嵌套使用宏。 字符串和注释中与宏名相同的字符串不进行宏展开。 带参数的宏(1) 定义形式:#define 宏名(参数表) [字符序列] 调用形式:宏名(实参表) 对带参数的宏进行宏展开的过程 程序中宏定义之后出现的宏名将按#define命令行中指定的字符序列从左到右进行置换。 字符序列中的宏形参,将以程序中对应的宏实参替代。 示例 #define PM(x, y) x*y … int a=1, b=2, c; c=PM(a+b, a-b); … 带参数的宏(2) 带参数的宏使用过程中容易出现两种错误 没有对宏字符序列中参数加括号,而出现表达式运算次序不符合意愿的结果 在宏名和带参数的括弧之间多加了空格。例如: #define S (r) PI*r*r 宏和函数的区别 函数调用先求出实参表达式值再带入形参;而带参数的宏则只进行单纯的文本替换。 函数调用在程序运行时处理,分配临时内存单元;而带参数的宏则不会。 函数中实参和形参之间类型要赋值相容;而宏不要求。 使用宏的次数多时,宏展开后源程序长,但是运行时间短;使用函数的次数多时,效果恰好相反。 取消宏定义 #define命令一般放在源文件的首部,宏名的有效范围是定义命令之后直到该源文件结束。 可以使用#undef命令终止宏定义的作用域。 形式:#undef 宏名 使用#undef的主要目的是把宏名局部化。 文件包含 所谓文件包含指:一个源文件将另一个源文件的全部内容包含进来。 两种形式 #include 文件名 #include 文件名 这两种形式的差别:使用不同的搜索路径 第一种形式采用的搜索路径是C库函数头文件所在的目录 第二种形式采用的搜索路径是:当前目录+ C库函数头文件所在的目录 经常用于包含头文件(.h) 文件包含可以嵌套,即被包含文件中还可以包含其他文件。 练习 下面程序执行FOR循环时,j的初值是__,终值是__,运行结果是_________。 #include stdio.h #define BOT (-2) #define TOP (BOT+5) #define PRI(arg)  printf(“%d\n”,arg) #define FOR(arg) for(;(arg);(arg)--) void main() { int i=BOT,j=TOP; FOR(j) switch(j) { case 1: PRI(i++); case 2: PRI(j);break; default: PRI(i); } } * * 源程序 (含预处 理命令) 预处理器 源程序 (不含预处 理命令) 编译器 目标 代码 词法和语法分析、代码生成、优化等 按预处理命令对程序进行文本替换等处理 结束 返回 返回 宏扩展的结果: c=a+b*a-b 所以c的值为1 返回 返回 返回 int i=(-2),j=((-2)+5); for (;(j);(j)--) 3 0 ①j=3 ②j=2 -2 1 2 -2 ③j=1 返回 *

文档评论(0)

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

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

1亿VIP精品文档

相关文档