编译预处理和数据类型重命名.ppt_第1页
编译预处理和数据类型重命名.ppt_第2页
编译预处理和数据类型重命名.ppt_第3页
编译预处理和数据类型重命名.ppt_第4页
编译预处理和数据类型重命名.ppt_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第18讲编译预处理和数据类型再命名 第18讲编译预处理和数据类型再命名 本讲主要内容宏定义不带参数的宏带参数的宏文件包含一般形式文件包含的有关说明条件编译ifdef else endif形式ifndef else endif形式if else endif形式数据类型再命名typedef的一般形式typedef应用举例 第18讲编译预处理和数据类型再命名 教学目标了解编译预处理的概念 了解宏的概念 了解文件包含的概念 熟练掌握文件包含命令include的用法 了解条件编译的概念 熟悉常用的条件编译命令及其用法 了解文件重名的意义 掌握typedef命令的使用方法 一 宏定义 不带参数的宏不带参数的宏是用一个标识符代替一个字符串 其一般形式如下 define宏名宏体其中的 表示这是一条预处理命令 凡是以 开头的均为预处理命令 define 为宏定义命令 宏名是一个标识符 宏体可以是一个字符串 也可以是一个数值 也可以是一个表达式等 例如 definePI3 1415926 一 宏定义 例17 1宏定义应用举例 defineTWO2 defineMSG Iloveclanguage defineFMT numberis d n main intnumber TWO printf FMT number printf s n MSG 一 宏定义 例17 2计算圆面积 definePI3 14main floatR 16 99 printf S PI R R f n PI R R 一 宏定义 例17 3计算圆的周长和面积 defineR3 0 definePI3 1415926 deinfeL2 PI R 使用宏R和PI定义宏L defineSPI R R 使用宏R和PI定义宏S main printf L f nS f n L S 一 宏定义 例17 4输出格式定义为宏 definePRprintf defineNL n defineD d defineD1DNL defineD2DDNL defineD3DDDNL defineD4DDDDNL defineS s main inta b c d charstring Thisisastring a 1 b 2 c 3 d 4 PR D1 a PR D2 a b PR D3 a b c PR D4 a b c d PR S string 一 宏定义 关于宏定义的说明 宏名一般使用大写形式 使用宏可以提高程序的可读性和可移植性 宏定义是用宏名来表示一个字符串 在宏替换时又以该字符串取代宏名 这只是一种简单的代换 宏定义不是C语句 后面不能有分号 如果加入分号 则加入的分号将作为宏体的一部分 通常把 define命令放在一个文件的开头 使其在本文件全部有效 宏定义终止命令 undef结束先前定义的宏名 程序中用双引号括起来的字符串 即使与宏名相同 也不替换 宏定义允许嵌套 在宏定义的字符串中可以使用已经定义的宏名 在宏展开时由预处理程序层层替换 宏定义名仅用于编译预处理 不是程序变量 因此系统不会为它分配内存空间 一 宏定义 带参数的宏带参数宏定义的一般形式如下 define宏名 参数表 字符串其中 宏名后的参数表可以是一个参数 也可以是多个参数 当有多个参数时 各参数之间用 分割 用于宏体的字符串部分要包括参数表中的参数 例如 definemax x y x y x y宏替换按如下过程进行 对于程序中带实参的宏 按照宏定义中的字符串从左到右进行替换 当遇到宏中的形参时 就用程序语句中的宏实参取代它 对于宏定义字符串 宏体 中的非参数字符 则予以保留 一 宏定义 例17 5利用宏定义求三个数的最大数 include stdio h definemax x y x y x ymain inta b c m scanf d d d a b c m max a b 使用宏max a b为宏实参 printf max d n max m c m c为宏实参 一 宏定义 使用带参数的宏时应注意如下问题 在带参宏定义中 形式参数不分配内存单元 也不存在类型定义问题 而宏调用中的实参有具体的值 要用它们去替换形参 因此必须首先进行类型说明 如果程序中有使用表达式作为宏实参的情况 那么在进行宏定义时 出现在宏替换字符串中的宏参数应使用括号 进行限定 否则宏替换后有可能产生错误的结果 带参宏定义中 宏名和形参表之间不能有空格出现 一旦出现了空格 就变成了不带参数的宏定义 一 宏定义 带参数的宏与函数调用的区别 函数调用时要先计算实参表达式的值 然后传给形参 而带参的宏只是进行简单的符号替换 不存在计算表达式的值的问题 函数调用在程序运行过程中发生作用 而宏在程序的编译预处理阶段发生作用 函数调用只能得到一个返回值 使用宏能够得到多个结果 宏替换不占运行时间 只占编译时间 而函数调用则占用运行时间 在函数中 形参和实参是两个不同的量 各有自己的作用域 调用时要把实参值赋予形参 进行 值传递 而在带参宏中 只是符号替换 不存在值传递的问题 一 宏定义 例17 6计算圆的周长和面积 definePI3 1415926 defineCIRCLE R L S L 2 PI R S PI R R main floatr l s printf Inputr scanf f r CIRCLE r l s 源程序中使用带参数的宏 printf L f S f n l s 二 文件包含 为了在一个源程序中使用另一个源程序的代码 C语言提供了文件包含命令include 它的一般使用形式如下 include 文件名 文件包含命令的功能是把指定的文件插入该命令行位置取代该命令行 从而把指定的文件和当前的源程序文件连成一个源文件 二 文件包含 例17 7创建源文件userdef h并在程序e1707 c中使用它 如下是userdef h文件的内容 definePRINTprintf 定义符号常量PRINT defineINPUTscanf 定义符号常量INPUT definePI3 1415926 定义符号常量PI 如下是e1707 c文件的内容 include userdef h main floats r PRINT r INPUT f r s PI r r PRINT AREA f n s 二 文件包含 对文件包含命令还要说明以下几点 包含命令中的文件名可以用双引号括起来 也可以用尖括号括起来 以下写法都是允许的 include stdio h include但是这两种形式是有区别的 使用双引号则表示首先在当前的源文件目录中查找 若未找到才到包含目录中去查找 使用尖括号表示在包含文件目录中去查找 而不在源文件目录去查找 一个include命令只能指定一个被包含文件 若有多个文件要包含 则需用多个include命令 文件包含允许嵌套 即在一个被包含的文件中又可以包含另一个文件 三 条件编译 ifdef else endif形式一般形式如下 ifdef标识符程序段1 else程序段2 endif该形式的条件编译的过程 如果 标识符 已被 define 命令定义过 则对 程序段1 进行编译 否则对 程序段2 进行编译 如果没有 程序段2 上述格式中的 else 即不再使用 条件编译成为如下形式 ifdef标识符程序段 endif 三 条件编译 例17 8条件编译举例1 defineNUMokstructstu intnum char name charsex floatscore ps main ps structstu malloc sizeof structstu ps num 102 ps name Zhangping ps sex M ps score 62 5 ifdefNUMprintf Number d nScore f n ps num ps score elseprintf Name s nSex c n ps name ps sex endiffree ps 三 条件编译 ifndef else endif形式一般形式如下 ifndef标识符程序段1 else程序段2 endif它与第一种形式的区别是将 ifdef 改为了 ifndef 它的功能是 如果标识符未被 define命令定义过则对程序段1进行编译 否则对程序段2进行编译 这与第一种形式的功能正相反 三 条件编译 if else endif形式一般形式如下 if常量表达式程序段1 else程序段2 endif它的功能是 如常量表达式的值为真 非0 则对程序段1进行编译 否则对程序段2进行编译 因此可以使程序在不同条件下 完成不同的功能 三 条件编译 例17 9条件编译举例2 defineR1main floatx s printf inputanumber scanf f x ifRs 3 14159 x x printf Areaofroundis f n s elses x x printf Areaofsquareis f n s endif 四 数据类型再命名 所谓数据类型再命名就是为已经存在的数据类型再定义一个另外的名字 目的是为了增强程序的可读性 使用的命令是typedef 它以C语句的形式出现在程序中 typedef的一般形式如下 typedef已定义的类型名新类型名 例如 typedefintINTEGER typedeffloatREAL 四 数据类型再命名 例17 10用typedef命令改写例13 3简单的密码加密程序 include stdio h structtable charinput charoutput typedefstructtableTABLE main charch intlength i TABLEtranslate a f b g w d f 9 y x s m 3 h k p f u length sizeof translate sizeof structtable while ch getchar n for i 0 translate i input ch i length i if i length putchar translate i output elseputchar ch 编译预处理和数据类型再命名 小结 1 使用预处理功能便于程序的修改 阅读 移植和调试 也便于实现模块化程序设计 2 宏定义是用一个标识符来表示一个字符串 这个字符串可以是常量 变量或表达式 在宏调用中将用该字符串代换宏名 3 宏定义可以带有参数 宏调

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论