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

下载本文档

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

文档简介

C语言程序设计 第8章编译预处理 问题 实际生活中 为了更好地处理一些事件或数据 会对其提前进行设定和准备 如 为避免重复 对已有的实行 拿来主义 ANSIC标准规定可以在 源程序中加入一些 预处理命令 以改进程序设计环境 提高编程效率 引子 本章要点 第8章编译预处理 本章难点 预处理的概念C语言处理系统的预处理功能预处理命令的使用 带参宏定义条件编译 编译预处理 作用 对源程序编译之前做一些处理 生成扩展C源程序种类宏定义 define条件编译 if else endif等文件包含 include格式 开头占单独书写行语句尾不加分号 8 1 8 2 8 3 宏定义 条件编译 文件包含 第8章编译预处理 宏定义的分类不带参数宏定义一般形式 define宏名 宏体 功能 用指定标识符 宏名 代替字符序列 宏体 宏展开 预编译时 用宏体替换宏名 不作语法检查 如 defineYES1 defineNO0 definePI3 1415926 defineOUTprintf Hello World 宏体可缺省 表示宏名定义过或取消宏体 定义位置 任意 一般在函数外面 作用域 从定义命令到文件结束 undef可终止宏名作用域格式 undef宏名 宏定义可嵌套 不能递归 例 defineMAXMAX 10 引号中的内容与宏名相同也不置换 例 definePI3 14159printf 2 PI f n PI 2 宏展开 printf 2 PI f n 3 14159 2 宏定义中使用必要的括号 例 defineWIDTH80 defineLENGTHWIDTH 40var LENGTH 2 宏展开 var 80 40 2 8 1宏定义 例8 1用不带参数的宏定义计算s 3 y y 3 y 4 y y 3 y 5 y y 3 y defineM y y 3 y main ints y printf Pleaseinputanumber scanf d 运行情况如下 Pleaseinputanumber 4 s 336 算法分析 单在计算式子中出现了三个 y y 3 y 为减少书写量 可使用宏定义 注意 defineM y y 3 y y y 3 y 两边的括号不能少 带参数宏定义一般形式 define宏名 参数表 宏体 宏展开 先把宏引用替换为替换文本 再将替换文本中出现的形参用实参代替 例 defineS a b a b 8 1宏定义 例 defineS r PI r r相当于定义了不带参宏S 代表字符串 r PI r r 例 defineM y y y 3 y k M 5 宏展开时 先用y y 3 y替换M 5 再将替换文本中的形参y用实参5代替 最终得到 k 5 5 3 5 不能加空格 defineMAX x y x y x y main intx y max printf inputtwonumbers x y scanf d d 例8 3用带参宏定义求两数中的大者 运行情况如下 inputtwonumbers x y 5 6 max 6 MAX x y 替换为 x y x y 进一步替换为 5 6 5 6 宏体及各形参外一般应加括号 例 definePOWER x x xx 4 y 6 z POWER x y 宏展开 z x y x y 一般写成 definePOWER x x x 宏展开 z x y x y 8 1宏定义 例8 2分别引用以下宏定义 求3 F 3 2 的值 A defineF x x x x B defineF x x x x C defineF x x x x D defineF x x x x 解 表达式3 F 3 2 在分别引用以上4个宏定义后 其值为 替换为 3 x x x 3 3 2 3 2 3 2 22 B 替换为 3 x x x 3 3 2 3 2 3 2 80 C 替换为 3 x x x 3 3 2 3 2 3 2 48 D 替换为 3 x x x 3 3 2 3 2 3 2 90 例8 4一个宏定义代表多条语句 defineSSSV s1 s2 s3 v s1 l w s2 l h s3 w h v w l h main intl 3 w 4 h 5 sa sb sc vv SSSV sa sb sc vv printf sa d nsb d nsc d nvv d n sa sb sc vv 运行情况如下 sa 12sb 15sc 20vv 60 宏定义也可用来定义多个语句 带参的宏与函数区别 定义方式不同 带参宏使用预处理命令 define定义 而函数使用函数定义 参数性质不同 带参宏的参数表中的参数不必说明其类型 也不分配存储空间 而函数参数表中的参数需说明其类型并为其分配存储空间 实现方式不同 宏展开是在编译时由预处理程序完成的 不占用运行时间 而函数调用是在程序运行时进行 需占用一定的运行时间 参数传递不同 若实参为表达式 引用带参宏时只进行简单的字符替换 不计算实参表达式的值 而函数调用时 则先计算表达式的值 然后代入形参 返回值不同 带参宏定义无返回值 而函数有返回值 defineSQ MACRO y y y main inti 1 printf SQ fun n while i 5 printf d n SQ fun i i 1 printf SQ MACRO n while i 5 printf d n SQ MACRO i SQ fun inty return y y 例8 8函数与带参宏定义的进一步比较 运行情况如下 SQ fun 1491625SQ MACRO 1925 条件编译的功能 在编译源文件之前 根据给定的条件决定编译的范围 形式一 ifdef标识符程序段1 else程序段2 endif 如果标识符是已被 define命令定义过的宏名 就对程序段1进行编译 否则对程序段2进行编译 8 2条件编译 条件编译举例 defineDEBUGmain inta 4 ifdefDEBUGprintf Nowtheprogrammerisdebuggingtheprogram elseprintf a d a endif 若没有第一行的宏定义命令 程序运行后会输出 a 4 运行情况如下 Nowtheprogrammerisdebuggingtheprogram 条件编译形式二 ifndef标识符程序段1 else程序段2 endif 如果标识符未被 define命令定义过 就对程序段1进行编译 否则对程序段2进行编译 形式三 if常量表达式程序段1 else程序段2 endif 如果常量表达式的值为真 非0 就对程序段1进行编译 否则对程序段2进行编译 例8 10设置一个开关 判断输入值是半径还是边长 实现求圆或正方形的面积 defineR1main floatc r s printf inputanumber scanf f endif 运行情况如下 inputanumber 3 areaofroundis 28 274309 若程序的第一行改为 defineR0则程序运行情况如下 inputanumber 3 areaofsquareis 9 000000 条件编译与条件语句的区别 条件编译也是一种选择结构 它根据给定的条件 从源程序段1和源程序段2中选择其中之一进行编译 使用条件语句将会对整个源程序进行编译 生成的目标代码较长 而采用条件编译 则根据条件只编译其中的程序段1或程序段2 生成的目标代码较短 在程序调试时 经常需要查看某些变量的中间结果 这时也可以使用条件编译 在程序中设置若干调试用的语句 例如 defineFLAG1 ifFLAGprintf a d a endif 文件包含的功能 一个源文件可将另一个源文件的内容全部包含进来 一般形式 include 文件名 或 include 处理过程 预编译时 用被包含文件的内容取代该预处理命令 再对 包含 后的文件作一个源文件编译 先在当前目录搜索 再搜索标准目录 可指定路径 直接按标准目录搜索 不能指定路径头文件必须是文本文件 扩展名没限制 8 3文件包含 例 include C TC F2 c include 被包含文件内容源文件 c 头文件 h stdio h EOF和NULL宏定义及输入输出函数的原型math h 各个数学函数的原型 文件包含可嵌套 将那些公用的或常用的宏定义 函数原型 数据类型定义及全局变量的定义和声明等 组织在一些头文件中 在程序需要使用到这些信息时 就用 include命令把它们包含到所需的位置上去 从而免去每次使用它们时都要重新定义或声明的麻烦 例8 11用户头文件的编写和使用 ifndef L8 11 H 定义宏 以防止重复包含此头文件 define L8 11 H include defineADD a b a b 定义宏 实现两数的加法 defineSUB a b a b 定义宏 实现两数的减法 intMUL inta intb 定义函数 实现两数的乘法 returna b floatDIV floata floatb 定义函数 实现两数的除法 if b 0 returna b elseprintf Error Thedenocannotbezero endif 头文件L8 11 h include L8 11 h 包含自定义头文件 main inta b intsum product floatdifference quotient printf Pleaseinputtwonumbers scanf d d 程序运行情况如下 Pleaseinputtwonumbers 34 12 sum 46difference 22 000000product 408quotient 2 833333 注意一个 include命令只能包含一个头文件 若有多个文件要包含 则需用多个 include命令 例如 如果file1 c中包含file2 c 而file2 c中要用到file3 c的内容 则可在file1 c中用两个 include命令进行包含 包含顺序如下 include file3 c include file2 c 当某个头文件的内容发生变化时 意味着包含该头文件的源程序也发生变化 所以需要重新编译 课后习题1 1 include defineN2 defineMN 1 defineNUM M 1 M 2main inti for i 1

温馨提示

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

评论

0/150

提交评论