




已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第 8章 编译预处理 第 8章 预处理命令 本章概述 本章的学习目标 主要内容 第 8章 编译预处理 本章概述 介绍宏定义的两种形式, 介绍文件包含的使用方法 , 介绍条件编译的概念。 第 8章 预处理命令 第 8章 编译预处理 本章的学习目标 : 本章教学目的: 掌握宏定义的两种形式,掌握文件包含的使用方法了解条件编译的概念。 本章教学重点: 宏定义的两种形式,文件包含的使用方法。 本章教学难点: 带参数的宏定义。 第 8章 预处理命令 第 8章 编译预处理 第 8章 预处理命令 宏定义 “文件包含 ”处理 条件编译 本章小结 主要内容 : 第 8章 编译预处理 编译预处理是指一些行首以 #开头的特殊语句 , 必须在对程序进行通常的编译之前 , 先对程序中这些特殊的命令进行“ 预处理 ” , 即根据预处理命令对程序作相应的处理 ( 例如 ,若程序中用 # , 则在预处理时将程序中所有的 。 经过预处理后程序不再包括预处理命令了 , 最后再由编译程序对预处理后的源程序进行通常的编译处理 , 得到可供执行的目标代码 。 第 8章 预处理命令 宏定义、文件包含和条件编译 它们分别用宏定义命令、文件包含命令和条件编译命令来实现。为了与一般 些命令以符号“”开头。 第 8章 编译预处理 宏定义 宏定义指的是用 #不带参数和带参数两种形式。 不带参数的宏定义 不带参数的宏定义的一般形式为: # 标识符 字符串 含义是用指定的宏名 ( 即标识符 ) 来代表其后字符串 。 第 8章 编译预处理 例如 : #10000 #“ %d, %d, %dn” 作用是指用标识符 10000” , 用标识符 , 用标识符 “ %d, %d, %dn” ” , 在编译预处理时 , 将程序中在该命令以后出现的所有的 %d, %d, %dn” 代替 。这种方法使用户能以一个简单的名字代替一个长的字符串 , 可以减小重复编程工作量 , 而且不容易出错 。 把定义时所用的标识符称为 “ 宏名 ” , 即 在预编译时将宏名替换成字符串的过程称为 “ 宏展开 ” 。 注意: 宏名习惯用大写字母表示。定义宏与定义变量含义不同,宏定义只是作字符替换,并不给宏名分配内存空间。 第 8章 编译预处理 例 # # 100 i,; i=0;i #S(a, b, h) (a+b)*h/2 , , 0; S=%dn”, S(; ; S(c1,c2,开为: (c1+。程序实际执行的是下面的输出语句: S=%dn”, (c1+); 如果将上面的 S(c1,c2,成 S(6, 2+8),运行程序后,输出结果还是 70吗? 第 8章 编译预处理 在使用带参数的宏定义时 , 宏名和括号之间不能有空格 , 否则系统会把括号 、 形参和字符串认为是一个字符串 。 例如 , 如果有 S (x,y) x*y 会被认为: 不带参的宏名 ) , 它代表字符串 “ (x,y) x*y” 。 上面介绍的用带参数的宏求球的体积和梯形的面积等问题显然也可以用函数解决 。 带参数的宏和函数在形式上有相似的地方 , 但是它们有许多不同点: (1)宏展开是在编译时进行的 , 不占用程序运行时间 , 在展开时并不分配内存单元 , 即使是带参数的宏也不分配内存单元;而函数调用则是在程序运行时进行处理的 , 占用程序运行时间 , 要为形参分配临时的内存单元 。 (2) 宏展开只是替换;而函数调用时 , 要计算实参表达式的值后传递给形参 , 不是替换 。 函数调用时存在着从实参向形参传递数据的过程 , 而使用带参数的宏 , 也不存在传递数据的过程 。 (3)宏名以及它的参数都不存在类型问题 , 展开时用指定的字符串替换即可 。 而函数中的实参和形参都要定义类型 。 (4)宏展开后对源程序长度有影响,而函数调用对源程序长度无影响。 第 8章 编译预处理 有些问题,用宏和函数都可以,如下例: 用函数: x,y) xy)?x:y; ) a,b,c,d,t; t =a+b,c+d); 用宏 : # x,y) (x)(y)?(x):(y) ) a,b,c,d,t; t = a+b,c+d); 赋值语句展开后为 t = (a+b)(c+d)?(a+b):(c+d); 第 8章 编译预处理 “文件包含”处理 来实现 “ 文件包含 ” 的操作 。作用是将一个源文件的全部内容包含进另一个源文件中来 。 被包含的文件可以是 库函数头文件等 。 因为 # 所以这些被包含的文件通常被称为 “ 标题文件 ” 或 “ 头文件 ” , 常以 “ h为 为文件的扩展名 。 当然也可以用其他文件扩展名 , 但无论用什么扩展名 , 这个被包含文件必须是文本文件 。 函数 , 每一个库函数都有自己对应的 头文件 , 在 要使用一些库函数中定义的数据和变量 , 在使用某一库函数时 , 都要在程序中 使用 # 否则 , 程序在编译时报错 。 第 8章 编译预处理 文件包含的使用格式为: “文件名 ” 或 文件名 其中的 “ 文件名 ” 和 的区别是:当使用“ 文件名 ” 形式时,预处理程序首先检索当前文件目录是否有该文件,如果没有,再检索 使用 形式时,预处理程序直接检索 使用 “ 文件名 ” 形式时,文件名的前面可添加路径。 例如: #d:tc 第 8章 编译预处理 常用的标准库头文件的扩展名都是 h, 如: # /*标准输入输出函数文件 */ # /*字符串函数文件 */ # /*字符函数文件 */ # /*数学函数库文件 */ “ 文件包含 ” 命令可以节省程序设计人员的劳动 。 例如 , 可以将经常使用一组固定的符号常量 (g= e=用宏定义命令组成一个文件 , 只要用 # 正确的使用 # 将会减少不必要的重复工作 , 提高编程效率 。 特别是在一个软件开发小组共同协作开发大型软件时 , 利用它可以定义程序中共同的常量 、函数原型 、 宏等 , 这样可以便于修改且不易出错 。 第 8章 编译预处理 例 编制如下内容的被包含文件,该文件名为 #x,y) t=x;x=y;y=t #x,y) xy?x:y #x,y) (x+y)/2 #x,y) x+y) 编写另一个程序 容如下: # t, x=567, y=123; x=%f, y=%fn, x, y); x,y); x=%f, y=%fn, x, y); x与 fn, x,y); x与 fn, x,y); x与 fn, x,y); ; 执行程序 果显示如下: 7 第 8章 编译预处理 编译并执行程序 果如下: x=y= x=y= x与 x与 x与 注意:在编译时并不是作为两个文件进行连接的 , 而是作为一个源程序编译 ,得到一个目标 (件 。 第 8章 编译预处理 说明: (1)如果要包含 必须用 n个 即一个 (2)假设 “ 、 “ 、 “ 是三个不同的文件 , 若在 “ 有如下两行命令: # # 则在文件 “ 中可以用 “ 和 “ 的内容 , 在文件 “ 中可以用 “ 的内容 , 不必在文件 “ 中再使用 “ # ” 命令 。 若在 “ 中只有 “ # 命令 , 而“ 中又要使用 “ 的内容 , 也可以让 “ 中出现 “ #” 命令 。 即文件包含可以嵌套使用 。 第 8章 编译预处理 例 分析下面程序的执行情况。 /* # # ; ; c; c=)!=n) c); ; 在编译 文本替换 # 因此本例程序功能 是接受用户的按键, 直到按回车键为止, 然后将字符序列显 示出来。 第 8章 编译预处理 件编译 有时希望当满足某条件时对一组语句进行编译 ,而当条件不满足时则编译另一组语句 , 使得同一个源程序在不同的编译条件下能够产生不同的目标代码文件 。 这就是 “ 条件编译 ” 。 条件编译命令有以下 3种形式: 1、 # 标识符 程序段 1 # 序段 2 # 用:当标识符已经被定义过(一般是用 ,则对程序段 1进行编译;否则编译程序段 2。 其中( # 程序段 2 )可以没有。 第 8章 编译预处理 作用: 若标识符未被定义,则编译程序段 1;否则编译程序段 2。 2、 # 标识符 程序段 1 # 序段 2 # 、 # 表 达式 程序段 1 # 序段 2 # 用:当指定的表达式值为真(非零)时编译程序段 1;否则编译程序段 2。 第 8章 编译预处理 # # 0 i, a10; s=0, t=1 ; i=0; i10; i+) %d”, &ai); # i=0; i10; i+) t=t*ai; %f, t ); # i=0; i10; i+) s= s+ai; %f, s ); # ; 执行程序,若输入如下 10个数: 1 2 3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 网红面包店品牌战略规划与区域代理合作协议
- 抖音公共卫生安全信息共享与应急响应合同
- 海外医学教育注射泵租赁与维修服务合同
- 网络安全合规审查补充协议
- 机器人减速器租赁与自动化生产线集成合同
- 宠物美容服务行业品牌授权加盟合同
- 澳新市场股权合作开发与文化产业投资合同
- 短视频平台用户数据销毁及隐私保护服务合同
- 医疗设施国际输液泵租赁与操作技能培训服务协议
- 医院培训课件:《手卫生》
- 城市居住区规划设计规范2018版全文
- 《TAVR的临床应用》课件
- 广东省深圳市2024-2025学年高一上学期期末考试英语试题(含答案)
- 成语故事-此地无银三百两-课件
- 程序员兼职协议
- 《防癌抗癌专题》课件
- (PPAP)生产件批准作业指导书
- 催收物业费的委托代理合同
- 智慧加气站综合管理平台建设方案
- 生成式AI时代下的提示素养培育研究
- 2024年高考真题-化学(天津卷) 含解析
评论
0/150
提交评论