第09章 编译预处理.ppt_第1页
第09章 编译预处理.ppt_第2页
第09章 编译预处理.ppt_第3页
第09章 编译预处理.ppt_第4页
第09章 编译预处理.ppt_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

第九章编译预处理 目的 为了简化程序的编写 提高程序的可移植性 可读性 模块化 C语言设计了若干命令 编译预处理命令 并可出现于程序当中 处理流程 第一次编译扫描时 将预编译命令处理完 然后再进行正式编译 生成目标代码 1 宏定义命令 有三种类型的预处理命令 为了与C语句区别 这些命令均以 开头 2 文件包含命令 3 条件编译命令 9 1宏定义 简化程序的书写 提高可读性 可移植性 一 无参数形式 define标识符字符串表达式 宏定义分为 无参数和有参数二种形式 例 definePAI3 14159 defineArray size500 intm Array size 实际处理时 用 字符串表达式 替换程序中的标识符 宏名 从开始定义的位置至文件结尾 但允许提前终止 用命令 undef标识符 defineM10 5 main undefM 1 宏定义的作用域 include definePAI3 14159main floatr s r 2 0 s PAI r r printf s 5 3f n s undefPAIr 3 0 s PAI r r prinft s 5 3f n s 运行结果 s 12 566 s 28 274 如果在程序中提前终止宏定义 则编译时会提示 undefinedsymbol PAI infunctionmain 例9 2 definePI3 14159 defineR3 0 defineL2 R PI defineSPI R Rmain prinf L f ns f n L S 2 可以嵌套定义 即可引用已定义的宏名 注意 双引号 中的L不被替换 结论 凡程序中常用到的字符序列 如 常数 公式 均可用宏定义 经常会改变的数据可用宏定义 结果 L 18 84954 L 2 3 0 3 14159 S 28 27131 S 3 14159 3 0 3 0 二 有参形式 形式 define宏名 参数表 字符串 defineS r 3 14159 r r S 3 0 相当于 3 14159 3 0 3 0 S 4 0 相当于 3 14159 4 0 4 0 合适于字符串表达式序列中有变化的字符 将这部分字符可定义为参数 例9 3 r2 3 1415 r r为字符序列 但r是可变的 main intx y b z x 3 y 4 b x y z f x y 编译后 z f x y 变成 x y b结果为 z 31 这个结果有可能与初始设想不一致 初始想法有可能是 若有 f x y 则应有 x y b 若有 f x y z 则应有 x y z b 例 definef a a b 1 宏展开实质为严格的字符替换 把参数看一种 字符串 所以定义宏时要考虑实参 替换 的各种可能 防止出现二义性 如程序例1中 若有 defines r 3 14159 r r 则S a b 的结果为 3 14159 a b a b为避免出现错误的结果 可将宏定义修改为 defineS r 3 1415926 r r 宏定义时必须注意以下几个方面 2 宏定义与函数是完全不同的概念 例 printf中经常有 n d 或程序中经常有printf pleaseinputanumber 等 则可用宏定义代替 如 3 灵活运用宏定义 可使程序书写简化 defineINPUT PROMPTprintf defineENprintf pleaseinputnumber n defineNLprintf n definePRINT F V printf V d t V definePRINT1 F X1 PRINT F X1 definePRINT2 F X1 X2 PRINT F X2 NLmain inta b c d floate f g h longi j charn m a 1 b 2 c 3 d 4 e 1 5 f 2 5 g 3 5 h 4 5 i 10 j 100 n x m y printf h f n h EN PRINT d a PRINT1 d a PRINT2 d a b PRINT2 d c d PRINT2 f e h PRINT2 f g h PRINT2 ld i j PRINT2 c n m 程序运行结果如下 h 4 500000Pleaseinputnumber V 1V 1V 2V 4V 0V 0V 100V 121 例9 4 9 2文件包含 C语言允许在一个文件预编译时 将另一个文件原封不动地包含进来 当一组符号常量的定义为公用时 可作为一个独立的文件被其它文件包含 目的 当函数不在一个文件中 既可用link连接编译后的obj文件 也可用 文件包含 方式 格式 include 文件名 f1 c f2 c include f2 c main main 预编译后 f1 c 为f2 c中的内容 再进行正式编译 1 一个include只能写一个文件 包含多个文件需多个include 只在f1 c中用 include include f2 c include f3 c 分别在f1 c f2 c中用 include在f1 c中 include f2 c 在f2 c中 include f3 c 2 当f1 c包含f2 c 而f2 c又包含f3 c时 有两种包含形式 3 一般用 h扩展名命名被包含文件 h为head之意以与一般 c文件区别 如系统stdio h 系统 h文件在子目录INCLUDE下 4 include后的文件名既可用 也可用 两者区别 首先在当前目录中找 然后再去标准目录中找 只在标准目录 include目录 中找 5 被包含文件和包含文件最后形成一个文件 因此 全局变量作用域为整个文件 不必用extern说明 9 3条件编译 有时 C程序的一部分语句是否起作用要根据一定的条件 即由条件而决定是否起作用 例如 调试程序时 需加多条printf 但调试完则要一一删除 有的语句也视条件而决定其具体形式 形式1 ifdef标识符程序段1 else程序段2 endif 功能 当标识符在此之前被定义过 即用 define定义过 则编译程序段1 否则编译程序段2 其中 程序段即可为语句组 也可为命令行 条件编译命令的三种形式 例 为了调试程序 加上以下条件编译 ifdefDEBUGprintf x d y d z d x y z endif 另 else后面部分可没有 但 endif保留 只要在此之前有 defineDEBUG则编译printf x d y d z d x y z 例 include defineENprintf Pleaseinputnumber n main inta 123 b 456 ifdefENprinft Thisistest a d n a elseprinft Thisistest b d n b endif 编译时会有警告 b isassignedavaluethatisneverused 运行结果 Thisistest a 123 形式2 ifndef标识符程序段1 else程序段2 endif 功能 与形式1的条件正好相反 即 当标识符未被定义 则编译程序段1 否则编译程序段2 例 编译时会有警告 a isassignedavaluethatisneverused 运行结果 Thisistest b 456 include defineENprintf Pleaseinputnumber n main inta 123 b 456 ifndefENprinft Thisistest a d n a elseprinft Thisistest b d n b endif 形式3 if表达式程序段1 else程序段2 endif 功能 当表达式 0 则编译程序段1 否则编译程序段2 例9 8 输入一任意字符串 需将其全部转化为大写字母 或者将其转化为小写字母 只编一个程序 程序中用条件编译 决定是全部转为大写字母还是小写字母 defineLETTER1 0 m

温馨提示

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

评论

0/150

提交评论