




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十一章预处理命令与程序组织 学习目标 C语言的预处理命令 宏替换的使用方法程序的组织方式 课程内容 11 1概述11 2 define定义宏11 3预定义宏11 4 include包含11 5条件编译11 6程序组织 预处理指在进行编译的第一遍扫描 词法扫描和语法分析 之前所作的工作 预处理是C语言的一个重要功能 它由预处理程序负责完成 当对一个源文件进行编译时 系统将自动引用预处理程序对源程序中的预处理部分作处理 处理完毕自动进入对源程序的编译 11 1概述 源文件 c 运行文件 exe 编译 编译 编译 目标文件 obj 连接 编译 连接 连接 编译预处理包括 宏定义文件包含条件编译 分别用宏定义命令 文件包含命令 条件编译命令来实现 为了与一般C语句相区别 这些命令以符号 开头 main floatr s c scanf f 如何修改圆周率 11 2 define定义宏 宏定义的功能 在源程序中每次遇到宏名时 均以定义的串代换它 这个替换过程称为 宏代换 或 宏展开 宏定义的形式 宏取消 define宏名字符串 undef宏名 如果被取消的宏实际上没有被 define所定义 针对它的 undef并不会产生错误 当一个宏定义被取消后 可以再度定义它 源程序 definePI3 14 defineSPI r r defineV4 S r 3main floatr printf nInputr scanf f 编译预处理后的程序 main floatr printf nInputr scanf f S V S V 宏代换不是函数 与函数的区别 简单置换 与调用函数不同 次数多时使程序变长 而函数调用不使程序变长 宏展开在编译时进行 占用编译时间 不占运行时间 不进行值的传递处理 无返回值 函数占运行时间 宏是简单置换 没有返回值 函数有返回值 不定义形参类型 无类型 宏特点 替换需要注意替换时可能引起的优先级问题 最好的办法就是将宏的参数直接用括号括起来 例11 1 创建一个求两个数中较大数的宏1 defineMax value1 value2 value1 value2 value1 value22voidmain 3 4intiVar1 3 iVar2 8 5floatfVar1 3 5 fVar2 10 6 6doubledVar1 10 0 dVar2 100 0 7printf Twointegerscompare n 8printf Max d d d n iVar1 iVar2 Max iVar1 iVar2 9printf Twofloatscompare n 10printf Max f f f n fVar1 fVar2 Max fVar1 fVar2 11printf Twodoublescompare n 12printf Max f f f n dVar1 dVar2 Max dVar1 dVar2 13 运行结果如下 Twointegerscompare Max 3 8 8Twofloatscompare Max 3 500000 10 600000 10 600000Twodoublescompare Max 10 000000 100 000000 100 000000 宏定义 参数没有设置类型 当宏定义超过1行时 使用连接符 即反斜杆 例11 2 超过1行的宏1intfunc swap intA intB 2 3inttemp 4temp A 5A B 6B temp 7returntemp 8 9 defineSWAP A B TYPE 10 11TYPEtemp A 12A B 13B temp 14 函数定义 宏定义 15voidmain 16 17intiVar1 10 iVar2 20 18printf Beforefunc swap iVar1 d iVar2 d n iVar1 iVar2 19func swap iVar1 iVar2 20printf Afterfunc swap iVar1 d iVar2 d n iVar1 iVar2 21printf BeforeSWAP iVar1 d iVar2 d n iVar1 iVar2 22SWAP iVar1 iVar2 int 23printf AfterSWAP iVar1 d iVar2 d n iVar1 iVar2 24 运行结果如下 Beforefunc swap iVar1 10 iVar2 20Afterfunc swap iVar1 10 iVar2 20BeforeSWAP iVar1 10 iVar2 20AfterSWAP iVar1 20 iVar2 10 调用函数 宏替换inttemp iVar1 iVar1 iVar2 iVar2 temp 例11 3 宏替换引起的优先级问题1 defineSQUARE x x x2 defineSQUARE M x x x 3voidmain 4 5intiVar 5 6printf SQUARE d 3 d n iVar SQUARE iVar 3 7printf SQUARE M d 3 d n iVar SQUARE M iVar 3 8 程序运行结果如下 SQUARE 5 3 23SQUARE M 5 3 64 宏替换iVar 3 iVar 3 5 3 5 3 5 15 3 23 宏替换 iVar 3 iVar 3 5 3 5 3 64 11 3预定义宏 在C语言中预定义了一些有用的宏 这些宏主要是提供当前编译的信息 宏 LINE 和 STDC 是整型常量 宏 FILE DATE TIME 是字符串量 例11 4 预定义宏1voidmain 2 3printf TheFileis s n FILE 4printf Itiscompiledon sat s n DATE TIME 5printf Thelinenumberofthislineis d n LINE 6 运行结果如下 TheFileis SOURCE 11 4 CItiscompiledonNov152007at16 57 06Thelinenumberofthislineis 5 11 4 include包含 作用 包含文件预处理器发现 include命令后 就会寻找后跟的文件名并把这个文件的内容包含到当前文件中 为什么要包含文件呢 包含的文件中有编译器所需的信息 例如stdio h文件通常包含EOF NULL getchar函数和putchar函数的定义 包含大型头文件并不一定显著增加程序的大小 很多情况下 头文件中的内容是编译器产生最终代码所需的信息 而不是加到最终代码里的具体语句 功能 文件包含是将指定的某个源文件的内容全部包含到当前文件中 用include命令实现 11 4 include包含 include的一般形式 include headfile include include预处理标记 先在当前目录搜索 再搜索标准目录 可指定路径 直接按标准目录搜索 预处理标记会被预处理器进行替换 替换的结果必须符合前两种形式中的某一种 11 5条件编译 功能 希望对程序中的一部分内容在满足一定条件时编译 否则不编译 或编译另一部分内容 命令 if elif else endif基本格式 说明 if常量表达式1语句 elif常量表达式2语句 elif常量表达式3语句 else语句 endif 1 if和 else分别相当于C语句中的if else 它们根据常量表达式的值来判别是否编译后面的语句 2 elif相当于C中的elseif 3 else之后不带常量表达式 例11 5 条件编译1 include2 defineMY VERSION13voidmain 4 5 ifMY VERSION 16printf ThisisVersion1 n 7 elifMY VERSION 28printf ThisisVersion2 n 9 elifMY VERSION 310printf ThisisVersion3 n 11 else12printf TheVersionnot1 2 3 n 13 endif14printf Thislineisexcutednomatterhowtheversionitis n 15 运行结果如下 ThisisVersion1 Thislineisexcutednomatterhowtheversionitis 11 6程序组织 问题 当团队开发较大的程序时 如何对于多个源程序进行组织 办法 一般说来 团队成员必须达成一致 他们使用相同的方法组织他们的文件 为了保持一致性 通常把共享类型的定义放到头文件中 头文件以 h 作为扩展名 函数的实现放到 c 文件中 利用这种风格 类型可以保持更好的独立 也容易被其它程序应用 头文件功能 实现 c文件之间的信息共享 可帮助写出移植性好 可重用性好的程序 内容 包含需要共享的信息 注意 一般不让 include命令包含 c文件 主要原因是 当该头文件被多个源程序包含时 会将该 c文件多次编译 同样 将函数体放在头文件中也会引发这类问题 程序组织与条件编译C语言中不允许出现循环包含 解决思路 调整 h文件的内容 将其中的某个 h文件中的内容合并到别的 h文件中 当然合并时需要理清它们之间的先后关系 1 ThisisFileA h 2 defineA H3 if defined D H 4 include D h 5 endif6 Morestuffhere 7 EndofA h 1 ThisisFileB h 2 defineB H3 if defined D H 4 include D h 5 endif6 Morestuffhere EndofB h 1 ThisisFileC h 2 defineC H3 if defined D H 4 include D h endif6 Morestuffhere 7 EndofC h
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公司通信网络电缆线务员岗前考核试卷及答案
- 隧道地质灾害应急处理方案
- 2025春季河北邯郸市教育局市直学校选聘博硕人才300人考前自测高频考点模拟试题附答案详解(模拟题)
- 公司农业技术员安全考核试卷及答案
- 公司液压元件及液压系统制造工操作考核试卷及答案
- 工程施工人员进场管理方案
- 特种纸生产线项目经济效益和社会效益分析报告
- 2025第十三届贵州人才博览会贵阳幼儿师范高等专科学校引进高层次及急需紧缺人才考前自测高频考点模拟试题及参考答案详解1套
- 2025湖南邵阳市湘中幼儿师范高等专科学校公开招聘工作人员24人模拟试卷及一套答案详解
- 公路临时交通管制方案
- 门座起重安全培训资料课件
- 2025-2030辅助生殖技术服务市场规范化发展与区域布局战略报告
- 2025年纺织企业绿色生产技术引进可行性研究报告
- 2024年河北邢台市广宗县招聘事业单位人员考试真题
- 第三单元第2课时儿童乐园(教学设计)数学北师大版二年级上册2025
- 建设用地审查报批课件
- 慢性肾炎课件
- 2025年企业首席质量官培训考核试题(含答案)
- 游戏化翻转课堂模式在烧伤护理教学中的实践效果
- 中国沈阳铁路局劳动合同8篇
- 高考3500词汇表(完整版)
评论
0/150
提交评论