C语言程序设计教程(第2版)课件第10章.ppt_第1页
C语言程序设计教程(第2版)课件第10章.ppt_第2页
C语言程序设计教程(第2版)课件第10章.ppt_第3页
C语言程序设计教程(第2版)课件第10章.ppt_第4页
C语言程序设计教程(第2版)课件第10章.ppt_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

第10章编译预处理 本章要点熟练掌握include命令的含义和用法理解 define命令的使用了解各种条件编译 if else endif ifdef和 undef等 的意义及用法本章难点文件包含命令 include的使用带参宏与函数的区别区分条件编译预处理指令的使用场合 概述 一 编译预处理的概念 C语言允许在程序中使用几种特殊的命令 它们不是一般的C语句 在C编译系统对程序进行通常的编译之前 先对程序中这些特殊命令进行 预处理 然后将预处理的结果和源程序一起再进行通常的编译处理 以得到目标代码 二 主要预处理功能 宏定义 文件包含 条件编译 10 1文件包含 C语言提供 include命令来实现 文件包含 的操作 其一般形式为 作用 使编译系统把指定的被包含文件嵌入到带有 include的源文件中 文件包含 示意图 file1 cfile2 cfile1 c包含 include file2 c BABA a b c 假如file1 c文件中的内容如下 inta b c floatm n p charr s t file2 c文件的内容如下 include file1 c main 经过编译预处理后 file2 c文件的内容为 inta b c floatm n p charr s t main include 文件名 先在当前工作目录中去查找 若找不到再到指定的标准目录中去查找 如 对TurboC编译系统 先在用户目录下查找 然后在TC include文件夹中查找 include 直接到系统指定的标准目录中去查找 如 对TurboC编译系统 直接在TC include文件夹中查找 在使用编译预处理 include语句时 需要注意的几个问题如下 1 当 include语句指定的文件中的内容发生改变时 包含文件的所有源文件都应该注意重新进行编译等处理 2 文件包括可以嵌套使用 即被包括的文件中还可以使用 include语句 3 由 include语句指定文件中可以包含任何语言成分 通常将经常使用的 具有公共性质的符号常量 带参数的宏定义以及外部变量等集中起来放在这种文件中 这样可以避免一些重复操作 4 被包含的文件通常是源文件 而不是目标文件 根据经验的总结 以下内容放在头文件中比较合适 需要说明的是C语言对此没有强行的规定 包含指令 嵌套 如 include 函数声明 如 externfloatfun floatx 类型说明 如 enumbool false true 常量定义 如 constfloatpi 3 14159 数据声明 如 externintm 宏定义 如 definePI3 1415926 10 2 1无参宏定义 10 2宏定义 宏名 宏内容 无分号 引例 definePI3 1415926main floatl s r v printf inputradius scanf f 其中 definePI3 1415926作用是指定标识符PI来代表 3 1415926 宏定义允许嵌套 在宏定义的字符串中可以使用已经定义的宏名 在宏展开中由预处理程序层层代换 例如 defineN2 defineMN 1 defineNUM M 1 M 2 替换的过程为 NUM M 1 M 2 而M M 1 也就是说NUM N 1 1 N 1 2 宏名用做代替一个字符串 不作语法检查 宏定义的字符串不能以 结尾 字符串结束后一定要换行 C语言允许宏定义出现在程序中函数外面的任何位置 但一般情况下它总写在文件的开头 说明 宏名一般习惯用大写字母 以便与变量名相区别 在进行宏定义时 可以引用已定义的宏名 6 宏名的前后应有空格 以便准确地辨认宏名 如果没有留空格 则程序运行的结果会出错 说明 宏替换由编译程序预先进行 宏替换范围是除字符串以外的所有宏名字 若替换后文本串中仍含有宏名字 将再次进行替换 直到程序中不含宏名字为止 definePI3 1415926 defineR3 0 defineL2 PI R defineSPI R R 第一次替换 printf l f ns f n 2 PI R PI R R 二 printf l f ns f n 2 3 1415926 3 0 3 1415926 3 0 3 0 main printf l f ns f n L S 10 2 2有参宏定义 definePI3 1415926 defineS r PI r rmain floatr1 3 6 area area S r1 S r1 用PI r1 r1替换 printf r farea f n r1 area definePF x x x definePF x x x definePF x x x main inta 2 b 3 c c PF a b PF a 1 printf nc d c 按第一种宏定义 c a b a b a 1 a 1 按第二种宏定义 c a b a b a 1 a 1 按第三种宏定义 c a b a b a 1 a 1 注意替换时不求值 只是字符串的原样替换 defineMAX x y x y x ymain intn1 n2 floatf1 f2 scanf d d f f 程序举例 经预编译宏替换后的printf语句如下 printf maxi dmaxf f n1 n2 n1 n2 f1 f2 f1 f2 10 2 3终止宏定义 宏命令 undef用于终止宏定义的作用域 一般形式为 unfine宏名例如 definearea r PI r r main undefarea r func 由于在函数func 之前 使用 undef终止宏名area r 的作用 在函数func 中area r 不再起作用 undef也可以用于函数内部 10 2 4带参数的宏替换与函数的主要区别 函数调用时 先求出实参表达式的值 然后代入形参 而使用带参的宏只是进行简单的字符替换 函数调用是在程序运行时处理的 分配临时的内存单元 而宏替换则是在编译时进行的 在展开时并不分配内存单元 不进行值的传递处理 也没有 返回值 的概念 函数中函数名及参数均有一定的数据类型 而宏不存在类型问题 宏名及其参数无类型 宏替换不占运行时间 只占编译时间 而函数调用则占运行时间 例宏替换与函数调用的区别 defineMUL a b a bintm inta intb return a b main printf d n MUL 1 2 5 4 printf d n m 1 2 5 4 程序的运行结果为 73原因显而易见 调用MUL宏时 计算的表达式是1 2 5 4 而调用m函数时 计算的表达式的是 1 2 5 4 10 3条件编译 一 使用宏定义的标识符作为编译条件 作用 当所指定的标识符已经被 define命令定义过 则在程序编译阶段只编译程序段1 否则编译程序段2 作用 当所指定的标识符已经被 define命令定义过 则在程序编译阶段只编译程序段1 作用 当所指定的标识符未被 define命令定义过 则在程序编译阶段只编译程序段1 否则编译程序段2 例1 ifdefTURBO defineintint else defineintshort endif 可用于实现程序在不同环境下的兼容性 例2 ifdefDEBUGprintf x d y d n x y endif 可用于进行程序的调试 调试过程中 在程序前面加 defineDEBUG调试完成后 将前面的 defineDEBUG删除掉 二 使用常量表达式的值作为编译条件 作用 当所指定的表达式为真 非零 时就编译程序段1 否则编译程序段2 可以事先给定一定条件 使程序在不同的条件下执行不同的功能 注意 if和 endif必须配对使用 带有 elif的条件编译 定义的一般形式为 if表达式1程序段1 elif表达式2程序段2 elif表达式3程序段3 else程序段n endif这里的 elif的含义是 elseif 程序举例 用同一程序实现大小写字母转换 若定义UP转换为大写 include stdio h defineUPmain chars 128 gets s ifdefUPstrupr s elsestrlwr s endifputs s 例输入一个口令 根据需要设置条件编译 使之在调试程序时 按原码输出 在使用时输出 号 defineDEBUGvoidmain charpass 80 inti 1 printf npleaseinputpassword do i pass i getchar ifdefDEBUGputchar pass i elseputchar endif while pass i r 例 ifdef和 ifndef的使用 defineTED10main ifdefTEDprintf hited n elseprintf hianyone n endif ifndefRALPHprintf RALPHnotdefined n endif 程序运行结果为 h

温馨提示

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

评论

0/150

提交评论