c07编译预处理.ppt

上传人:hyn****60 文档编号:70970188 上传时间:2023-01-31 格式:PPT 页数:16 大小:100KB
返回 下载 相关 举报
c07编译预处理.ppt_第1页
第1页 / 共16页
c07编译预处理.ppt_第2页
第2页 / 共16页
点击查看更多>>
资源描述

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

1、第7章 编译预处理7.1宏定义7.2编译预处理7.3条件编译编译预处理编译预处理是编译预处理是 C C语言编译系统的一个组成语言编译系统的一个组成部分。部分。C C编译系统对程序进行编译之前,编译系统对程序进行编译之前,先对程序中以先对程序中以#开头的特殊命令进行开头的特殊命令进行“预预处理处理”,然后将预处理结果和源程序一起,然后将预处理结果和源程序一起进行编译处理,得到目标代码。进行编译处理,得到目标代码。C C语言提供的预处理功能主要有三种:语言提供的预处理功能主要有三种:宏宏定义、文件包含、条件编译。定义、文件包含、条件编译。它不属于它不属于c c语言语句,可出现在程序的任何位置,有语

2、言语句,可出现在程序的任何位置,有效范围从它们的出现点开始。效范围从它们的出现点开始。7.1 7.1 宏定义宏定义不带参数宏定义一般形式:不带参数宏定义一般形式:#define宏名宏名宏体宏体宏名宏名:由标识符定义由标识符定义宏体宏体:为一字符串为一字符串功能功能:预编译时进行宏展开预编译时进行宏展开,用宏体代替宏名用宏体代替宏名例如例如:#define PI 3.1415926#define PI 3.1415926#define E 2.78define E 2.78宏展开后宏展开后:a=2*3.1415926*r;s=3.1415926*r*r;例例1#define PI 3.14159

3、26 main()float a,s,r;printf(“input radius r:”);scanf(“%f”,&r);a=2*PI*r;s=PI*r*r;printf(“r=%f,a=%f,s=%f n”,r,a,s);说明:说明:1.宏定义不是宏定义不是c语句,不必在行末加语句,不必在行末加;号。号。2.宏定义用宏名代替一个字符串,预处理时仅做置换宏定义用宏名代替一个字符串,预处理时仅做置换3.通常放在文件头;习惯于大写。通常放在文件头;习惯于大写。4.可以用可以用“#undef宏名宏名”命令终止宏定义的作用域。命令终止宏定义的作用域。5.进行宏定义时,可引用已定义的宏名,进行层层置换

4、。进行宏定义时,可引用已定义的宏名,进行层层置换。例例#defineR3.0#definePI3.14159#defineL2*PI*R#defineSPI*R*Rmain()printf(“L=%fnS=%fn”,L,S);注意带参数的宏与函数不同注意带参数的宏与函数不同A.函数调用,先求实参然后传给形参;宏只是替代函数调用,先求实参然后传给形参;宏只是替代B.函数在运行时处理,宏在编译时进行,不占运行时间函数在运行时处理,宏在编译时进行,不占运行时间C.函数中形参与实参要进行类型定义;宏不存在类型问题函数中形参与实参要进行类型定义;宏不存在类型问题D.宏展开后可使程序变长;函数调用源程序长

5、度不变宏展开后可使程序变长;函数调用源程序长度不变E.函数只可得到一个返回值。宏可设法得到几个结果函数只可得到一个返回值。宏可设法得到几个结果例例:#define PI 3.14159#define S(r)PI*r*r main()float a=2.0,area;area=S(a);printf(“r=%fnarea=%fn”,a,area);例:例:#definea(s)s*5main()intx;x=5;printf(“%d”,a(x+3);代换为x+3*57.2文件包含一个源文件可将另一个源文件的内容包含进来。一般一个源文件可将另一个源文件的内容包含进来。一般形式:形式:#inclu

6、de“文件名文件名”或或:#include它用指定文件的全部内容代换该预处理行,使之成它用指定文件的全部内容代换该预处理行,使之成为源程序一部分。为源程序一部分。说明:说明:1.一个一个#include命令只能指定一个包含文件。命令只能指定一个包含文件。2.文件包含可以嵌套,即一个被包含文件可以包含另文件包含可以嵌套,即一个被包含文件可以包含另一个被包含文件。一个被包含文件。3.#include“文件名文件名”形式,系统先在引用被包含文形式,系统先在引用被包含文件源文件所在目录中寻找,找不到再按标准方式检索件源文件所在目录中寻找,找不到再按标准方式检索其他目录;其他目录;#include方式不

7、检查源文件所方式不检查源文件所在目录,直接按标准方式检索文件目录。在目录,直接按标准方式检索文件目录。例如例如:文件文件f3.cf3.c包含文件包含文件f4.cf4.c文件文件f4.cfloat ave(float a,int n)int k;float aver,sum=a0;for(k=1;kn;k+)sum=sum+ak;aver=sum/n;return(aver);文件文件f3.c#include“f4.cmain()float s10;int k;for(k=0;k10;k+)scanf(%f,&sk);printf(%fn,ave(s,5);printf(%fn,ave(s,10

8、);lC语言中提供了条件编译,可以按不同的条件去编译程语言中提供了条件编译,可以按不同的条件去编译程序的不同部分,因而产生不同的目标代码文件。这对于序的不同部分,因而产生不同的目标代码文件。这对于程序的移植和调试是很有用的。条件编译有三种形式,程序的移植和调试是很有用的。条件编译有三种形式,下面分别介绍:下面分别介绍:ll1.第一种形式第一种形式ll#ifdef标识符标识符l程序段程序段1l#elsel程序段程序段2l#endifl7.37.3条件编译条件编译l如果标识符已被#define命令定义过则对程序段1进行编译;否则对程序段2进行编译。如果没有程序段2(它为空),本格式中的#else可

9、以没有,即可以写为:ll#ifdef标识符l程序段l#endifl例:条件编译例:条件编译#ifdef的使用。的使用。l#includestdio.hl#defineTED10lmain()ll#ifdefTEDlprintf(HiTedn);/*如果定义了如果定义了TED,则编译,则编译此行代码此行代码*/l#elselprintf(Hianyonen);/*如果没用定义如果没用定义TED,则编译,则编译此行代码此行代码*/l#endifl#ifdefRALPHlprintf(RALPHnotdefinedn);/*如果定义了如果定义了RALPH,则编译此行代码,则编译此行代码*/l#end

10、ifl2.第二种形式第二种形式l#ifndef标识符l程序段1l#elsel程序段2l#endifll与第一种形式的区别是将“ifdef”改为“ifndef”。它的功能是:如果标识符未被#define命令定义过则对程序段1进行编译,否则对程序段2进行编译。这与第一种形式的功能正相反。3.第三种形式第三种形式l#if常量表达式常量表达式l程序段程序段1l#elsel程序段程序段2l#endifll它的功能是:如常量表达式的值为真它的功能是:如常量表达式的值为真(非非0),则,则对程序段对程序段1进行编译,否则对程序段进行编译,否则对程序段2进行编译。进行编译。因此可以使程序在不同条件下,完成不同

11、的功能。因此可以使程序在不同条件下,完成不同的功能。例:条件编译例:条件编译#if的使用的使用l#includestdio.hl#defineR1lmain()lfloatc,r,s;lprintf(inputanumber:);lscanf(%f,&c);l#ifRlr=3.14159*c*c;/*如果如果R为非为非0的数据,则编译此行和的数据,则编译此行和下一行代码下一行代码*/lprintf(areaofroundis:%fn,r);l#elsels=c*c;/*如果如果R为为0的数据,则编译此行和下一行的数据,则编译此行和下一行代码代码*/lprintf(areaofsquareis:%fn,s);l#endifl

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

当前位置:首页 > 生活休闲 > 生活常识

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

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