




已阅读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)(value1value2)?value1:value22voidmain()34intiVar1=3,iVar2=8;5floatfVar1=3.5,fVar2=10.6;6doubledVar1=10.0,dVar2=100.0;7printf(Twointegerscompare:n);8printf(Max(%d,%d)=%dn,iVar1,iVar2,Max(iVar1,iVar2);9printf(Twofloatscompare:n);10printf(Max(%f,%f)=%fn,fVar1,fVar2,Max(fVar1,fVar2);11printf(Twodoublescompare:n);12printf(Max(%f,%f)=%fn,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)23inttemp;4temp=A;5A=B;6B=temp;7returntemp;89#defineSWAP(A,B,TYPE)1011TYPEtemp=A;12A=B;13B=temp;14,函数定义,宏定义,15voidmain()1617intiVar1=10,iVar2=20;18printf(Beforefunc_swap:iVar1=%d,iVar2=%dn,iVar1,iVar2);19func_swap(iVar1,iVar2);20printf(Afterfunc_swap:iVar1=%d,iVar2=%dn,iVar1,iVar2);21printf(BeforeSWAP:iVar1=%d,iVar2=%dn,iVar1,iVar2);22SWAP(iVar1,iVar2,int);23printf(AfterSWAP:iVar1=%d,iVar2=%dn,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()45intiVar=5;6printf(SQUARE(%d+3)=%dn,iVar,SQUARE(iVar+3);7printf(SQUARE_M(%d+3)=%dn,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()23printf(TheFileis:%sn,_FILE_);4printf(Itiscompiledon%sat%sn,_DATE_,_TIME_);5printf(Thelinenumberofthislineis:%dn,_LINE_);6运行结果如下:TheFileis:SOURCE11_4.CItiscompiledonNov152007at16:57:06Thelinenumberofthislineis:5,11.4#include包含,作用:包含文件预处理器发现#include命令后,就会寻找后跟的文件名并把这个文件的内容包含到当前文件中。为什么要包含文件呢?包含的文件中有编译器所需的信息。例如stdio.h文件通常包含EOF、NULL、getchar函数和putchar函数的定义。包含大型头文件并不一定显著增加程序的大小。很多情况下,头文件中的内容是编译器产生最终代码所需的信息,而不是加到最终代码里的具体语句。,功能:文件包含是将指定的某个源文件的内容全部包含到当前文件中。用include命令实现。,11.4#include包含,#include的一般形式:#includeheadfile#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()45#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#includeD.h5#endif6/*Morestuffhere*/7/*EndofA.h*/,1/*ThisisFileB.h*/2#defineB_H3#if!defined(D_H)4#includeD.h5#endif6/*Morestuffhere*/*EndofB.h*/,1/*ThisisFileC.h*/2#defineC_H3#if!defined(D_H)4#includeD.h#endif6/*Morestuffhere*/7/*EndofC
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年新能源汽车智能驾驶交互界面在车载办公中的应用报告
- 新能源行业光伏发电技术升级与市场潜力研究报告
- 2025年风能发电设备制造行业竞争力分析报告
- 2025年新能源汽车智能座舱车载互联技术应用案例报告
- 生涯咨询招募方案模板
- 植草被安装施工方案
- 境外卫星电视节目应急预案
- 2025年新能源汽车充电基础设施建设与政策法规研究报告
- 朝阳公招考试题及答案
- 2025年新能源汽车车路协同通信技术在绿色出行推广中的应用报告
- 2025社会工作员考试(社会工作基础知识)综合能力测试题及答案
- 卫生院支委会补选书记会议记录范文
- 酸洗作业安全知识培训
- 沥青混凝土面层和沥青碎砾石面层分项工程质量检验评定表新城
- 2025年肇庆市怀集县卫生事业单位招聘考试笔试试卷【附答案】
- 2025年烟草专卖行业招聘面试技巧与模拟题解答
- 灭火器年度检测维修标准
- 书桌劳动课件
- 2025年福建省综合性评标专家库评标专家考试历年参考题库含答案详解(5套)
- 供油船管理办法
- 2026届福建省泉州市泉州实验中学中考冲刺卷英语试题含答案
评论
0/150
提交评论