预处理与程序组织.ppt

上传人:wuy****n92 文档编号:92005251 上传时间:2023-05-30 格式:PPT 页数:24 大小:227.16KB
返回 下载 相关 举报
预处理与程序组织.ppt_第1页
第1页 / 共24页
预处理与程序组织.ppt_第2页
第2页 / 共24页
点击查看更多>>
资源描述

《预处理与程序组织.ppt》由会员分享,可在线阅读,更多相关《预处理与程序组织.ppt(24页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第十一章预处理命令与程序组织 学习目标学习目标lC语言的预处理命令,宏替换的使用方法l程序的组织方式课程内容课程内容l11.1 概述l11.2#define定义宏l11.3 预定义宏l11.4#include包含l11.5 条件编译l11.6 程序组织n预处理指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。n预处理是C语言的一个重要功能,它由预处理程序负责完成。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。11.1概述概述源文件源文件源文件源文件 *.c*.c*.c*.c运行文件运行文件运行文件运行文件*.exe*

2、.exe*.exe*.exe编译编译编译编译编译编译编译编译编译编译编译编译目标文件目标文件目标文件目标文件*.obj*.obj*.obj*.obj连接连接连接连接编译编译编译编译连接连接连接连接连接连接连接连接编译预处理编译预处理编译预处理编译预处理 编编编编 译译译译n编译预处理包括:n 宏定义宏定义n 文件包含文件包含n 条件编译条件编译分别用宏定义命令宏定义命令、文件包含命令文件包含命令、条件编译命令条件编译命令来实现。为了与一般C语句相区别,这些命令以符号符号“#”开头开头。源文件源文件源文件源文件 *.c*.c*.c*.c运行文件运行文件运行文件运行文件*.exe*.exe*.ex

3、e*.exe目标文件目标文件目标文件目标文件*.obj*.obj*.obj*.obj编译编译编译编译连接连接连接连接main()main()main()main()float r,s,c;float r,s,c;float r,s,c;float r,s,c;scanf(“%f”,&r);scanf(“%f”,&r);scanf(“%f”,&r);scanf(“%f”,&r);s=r*r*s=r*r*s=r*r*s=r*r*3.143.143.143.14;c=2*r*c=2*r*c=2*r*c=2*r*3.143.143.143.14;printf(“s=%f,c=%f”,s,c);prin

4、tf(“s=%f,c=%f”,s,c);printf(“s=%f,c=%f”,s,c);printf(“s=%f,c=%f”,s,c);如何修如何修改圆周率改圆周率11.2#define定义宏n宏定义的功能:宏定义的功能:在源程序中每次遇到宏名时,均以定义的串定义的串代换它。这个替换过程称为“宏代换宏代换”或“宏展开宏展开”n宏定义的形式:宏定义的形式:n宏取消:宏取消:#define#define 宏名宏名 字符串字符串#undef#undef 宏名宏名如果被取消的宏实际上没有被#define所定义,针对它的#undef并不会产生错误。当一个宏定义被取消后,可以再度定义它。n源程序:n#de

5、fine PI 3.14n#define S PI*r*rn#define V 4*S*r/3nmain()nfloat r;n printf(nInput r:);n scanf(%f,&r);n printf(S=%.2f V=%.2fn,S,V);n编译预处理后的程序:main()float r;printf(nInput r:);scanf(%f,&r);printf(S=%.2f V=%.2fn,3.14*r*r,4*3.14*r*r*r/3);SVSV进入编译进入编译进入编译进入编译n宏代换不是函数。与函数的区别:宏代换不是函数。与函数的区别:简单置换简单置换,与调用函数不同,次数

6、多时使程序,与调用函数不同,次数多时使程序变长,变长,而函数调用不使程序变长。而函数调用不使程序变长。宏展开在编译时进行,占用编译时间,宏展开在编译时进行,占用编译时间,不占运不占运行时间,不进行值的传递处理,无返回值行时间,不进行值的传递处理,无返回值;函函数占运行时间。数占运行时间。宏是简单置换,没有返回值没有返回值;函数有返回值函数有返回值。不定义形参类型,无类型不定义形参类型,无类型。n宏特点:宏特点:替换替换需要注意替换时可能引起的优先级问题优先级问题。最好的办法就是将宏的参数直接用括号括起来将宏的参数直接用括号括起来。【例【例11.1】创建一个求两个数中较大数的宏】创建一个求两个数

7、中较大数的宏1#define Max(value1,value2)(value1value2)?value1:value22void main()34int iVar1=3,iVar2=8;5float fVar1=3.5,fVar2=10.6;6double dVar1=10.0,dVar2=100.0;7printf(Two integers compare:n);8printf(Max(%d,%d)=%dn,iVar1,iVar2,Max(iVar1,iVar2);9printf(Two floats compare:n);10printf(Max(%f,%f)=%fn,fVar1,fV

8、ar2,Max(fVar1,fVar2);11printf(Two doubles compare:n);12printf(Max(%f,%f)=%fn,dVar1,dVar2,Max(dVar1,dVar2);13 运行结果如下:运行结果如下:Two integers compare:Max(3,8)=8Two floats compare:Max(3.500000,10.600000)=10.600000Two doubles compare:Max(10.000000,100.000000)=100.000000宏定义参数没有设置类型 当宏定义超过当宏定义超过1行时,使用连接符(即反斜杆

9、行时,使用连接符(即反斜杆“”【例11.2】超过1行的宏1int func_swap(int A,int B)23int temp;4temp=A;5A=B;6B=temp;7return temp;89#define SWAP(A,B,TYPE)10 11TYPE temp=A;12A=B;13B=temp;14 函数定义宏定义15 void main()1617int iVar1=10,iVar2=20;18printf(Before func_swap:iVar1=%d,iVar2=%dn,iVar1,iVar2);19func_swap(iVar1,iVar2);20printf(Af

10、ter func_swap:iVar1=%d,iVar2=%dn,iVar1,iVar2);21printf(Before SWAP:iVar1=%d,iVar2=%dn,iVar1,iVar2);22SWAP(iVar1,iVar2,int);23printf(After SWAP:iVar1=%d,iVar2=%dn,iVar1,iVar2);24运行结果如下:Before func_swap:iVar1=10,iVar2=20After func_swap:iVar1=10,iVar2=20Before SWAP:iVar1=10,iVar2=20After SWAP:iVar1=20,

11、iVar2=10调用函数宏替换int temp=iVar1;iVar1=iVar2;iVar2=temp;【例【例11.3】宏替换引起的优先级问题】宏替换引起的优先级问题1#define SQUARE(x)x*x2#define SQUARE_M(x)(x)*(x)3 void main()4 5int iVar=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

12、)=64宏替换iVar+3*iVar+3=5+3*5+3=5+15+3=23宏替换(iVar+3)*(iVar+3)=(5+3)*(5+3)=6411.3 预定义宏 n在C语言中预定义了一些有用的宏。这些宏主要是提供当前编译的信息。宏_LINE_和_STDC_是整型常量,宏_FILE_,_DATE_,_TIME_是字符串量。预定义宏描述_LINE_当前源代码中的行号,以10进制整数标注_FILE_被编译的文件的名字,以字符串常量标注_DATE_编译的日期,以mm dd yyyy格式的字符串标注,如“Nov 15 2007”_TIME_编译的时间,以hh:mm:ss格式的字符串标注_STDC_如

13、果编译器接受ANSI C标准,那么值为1【例【例11.4】预定义宏】预定义宏1 void main()2 3printf(The File is:%sn,_FILE_);4printf(It is compiled on%s at%sn,_DATE_,_TIME_);5printf(The line number of this line is:%dn,_LINE_);6 运行结果如下:The File is:SOURCE11_4.CIt is compiled on Nov 15 2007 at 16:57:06The line number of this line is:511.4#in

14、clude包含n作用:包含文件预处理器发现#include命令后,就会寻找后跟的文件名并把这个文件的内容包含到当前文件中。n为什么要包含文件呢?包含的文件中有编译器所需的信息。例如stdio.h文件通常包含EOF、NULL、getchar函数和putchar函数的定义。包含大型头文件并不一定显著增加程序的大小。很多情况下,头文件中的内容是编译器产生最终代码所需的信息,而不是加到最终代码里的具体语句。功能:功能:功能:功能:文件包含是将指定的某个源文件的内容全部文件包含是将指定的某个源文件的内容全部文件包含是将指定的某个源文件的内容全部文件包含是将指定的某个源文件的内容全部包含到当前文件中。用包

15、含到当前文件中。用包含到当前文件中。用包含到当前文件中。用includeinclude命令实现。命令实现。命令实现。命令实现。11.4#include包含#include#include#include#include的一般形式的一般形式的一般形式的一般形式:#include headfile#include headfile#include headfile#include headfile#include#include#include#include#include#include#include#include 预处理标记预处理标记预处理标记预处理标记“”“”先在当前目录当前目录搜索,

16、再搜索标准标准目录目录-可指定路径可指定路径直接按标准目录标准目录搜索搜索预处理标记会被预处理器进行替换,替换的结果必须符合前两种形式中的某一种。#include “file2.c”file1.cfile2.cfile1.cfile2.cABA11.5 条件编译n n功能:功能:功能:功能:希望对程序中的一部分内容在满足一定条件时编译,否则不编译,或编译另一部分内容。n n命令:命令:命令:命令:#if、#elif、#else、#endifn n基本格式:基本格式:基本格式:基本格式:说明:说明:说明:说明:#if 常量表达式1语句.#elif 常量表达式2语句.#elif 常量表达式3语句.

17、#else语句.#endif1.#if和#else分别相当于C语句中的if、else,它们根据常量表达式的值来判别是否编译后面的语句。2.#elif相当于C中的else if。3.#else之后不带常量表达式。【例【例11.5】条件编译】条件编译1#include 2#define MY_VERSION 13 void main()4 5#if MY_VERSION=16printf(This is Version 1.n);7#elif MY_VERSION=28printf(This is Version 2.n);9#elif MY_VERSION=310printf(This is V

18、ersion 3.n);11#else12printf(The Version not 1,2,3.n);13#endif14printf(This line is excuted no matter how the version it is.n);15运行结果如下:运行结果如下:This is Version 1.This line is excuted no matter how the version it is.11.6 程序组织n问题:当团队开发较大的程序时,如何对于多个源程序进行组织?n办法:一般说来,团队成员必须达成一致,他们使用相同的相同的方法方法组织他们的文件。为了保持一致

19、性,通常把共享共享类型的定义类型的定义放到头文件中,头文件以头文件以“.h”作为扩展作为扩展名名。函数的实现放到函数的实现放到“.c”文件文件中。利用这种风格,类型可以保持更好的独立,也容易被其它程序应用。?n头文件头文件功能:功能:实现实现.c文件之间的文件之间的信息共享信息共享。可帮助。可帮助写出移植性好、可重用性好的程序。写出移植性好、可重用性好的程序。内容:内容:包含需要包含需要共享的信息共享的信息。注意:注意:一般不让一般不让#include命令包含命令包含.c文件文件。主要原因是,当该头文件被多个源程序包含时,主要原因是,当该头文件被多个源程序包含时,会将该会将该.c文件多次编译。

20、同样,将函数体放在文件多次编译。同样,将函数体放在头文件中也会引发这类问题。头文件中也会引发这类问题。n程序组织与条件编译程序组织与条件编译 C语言中不允许出现循环包含循环包含。解决思路:解决思路:解决思路:解决思路:n调整调整.h文件的内容文件的内容,将其中的某个.h文件中的内容合并合并到别的.h文件中,当然合并时需要理清它们之间的先后关系。#include“C.h”/*其它内容*/#include“A.h”/*其它内容*/#include“B.h”/*其它内容*/A.hB.hC.h1/*This is File A.h */2#define A_H3#if!defined(D_H)4#in

21、clude D.h5#endif6/*More stuff here*/7/*End of A.h*/1/*This is File B.h */2#define B_H3#if!defined(D_H)4#include D.h5#endif6/*More stuff here*/*End of B.h*/1/*This is File C.h */2#define C_H3#if!defined(D_H)4#include D.h#endif6/*More stuff here*/7/*End of C.h*/只要我们的只要我们的.c程序都包含程序都包含D.h头文头文件,就会自动包含件,就会自动包含A.h、B.h、C.h头文件头文件 1/*This is File D.h */2#define D_H3#ifndef A_H4#include A.h5#endif67#ifndef B_H8#include B.h9#endif1011#ifndef C_H12#include C.h13#endif1415/*More stuff here*/16/*End of D.h*/【例【例11.6】条件编译与循环包含问题解决】条件编译与循环包含问题解决

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁