C语言编译预处理课件.ppt

C语言编译预处理课件.ppt

ID:57057179

大小:505.50 KB

页数:19页

时间:2020-07-30

C语言编译预处理课件.ppt_第1页
C语言编译预处理课件.ppt_第2页
C语言编译预处理课件.ppt_第3页
C语言编译预处理课件.ppt_第4页
C语言编译预处理课件.ppt_第5页
资源描述:

《C语言编译预处理课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第八章编译预处理本章要点:了解预处理的概念及特点掌握有参宏与无参宏的定义及使用理解文件包含的使用及效果了解条件编译运行结果实例如:8.1宏定义一、不带参数的宏定义作用:用一个指定的标识符来代表一个字符串格式:#define标识符字符串标识符也叫“宏名”;将宏名替换成字符串的过程叫“宏展开”。#definePI3.1415926一#definePI3.1415926main(){floatl,s,r,v;printf(“inputradius:”);scanf(“%f”,&r);l=2.0*PI*r;s=PI*r*r;

2、v=3.0/4*PI*r*r*r;printf(“l=%10.4fs=%10.4f”,l,s);printf(“v=%10.4f”,v);}例结果inputradius:4l=25.1328s=50.2655v=150.7966一、不带参数的宏定义的几点说明1.宏名一般大写,以区别于变量名。2.宏定义只是简单替换,不作语法检查。例如3.宏定义不是C语句,不能乱加分号例如4.宏名的有效范围是从定义点到本源文件结束。但也可用#undef命令来终止宏名的作用域。例如5.宏定义可以层层置换,即在宏定义时可以引用

3、已定义过的宏名。例如6.对程序中用双引号括起来的字符串内的字符,即使与宏名相同,也不置换。例#definePI3.1415926#definePI3.l415926预处理时照常带入,只是在编译已被宏展开的源程序时才报错。例#definePI3.1415926;……area=PI*r*r;宏展开后:area=3.1415926;*r*r;#defineG9.8main(){…….}#undefGf1(){……}重点G的有效范围例8.2#defineR3.0#definePI3.1415926#defineL2*PI*

4、R#defineSPI*R*Rvoidmain(){printf(“L=%fS=%f”,L,S);}宏展开后为:printf(“L=%fS=%f”,2*3.1415926*3.0,3.1415926*3.0*3.0);例替换规则:二、带参数的宏定义作用:进行字符串和参数的替换格式:#define宏名(参数表)字符串例如程序示例说明1.宏的参数可以是常量,变量或表达式。对表达式应注意加适当的括号。如2.定义时宏名与带参的括号之间不能有空格。否则变成无参的宏定义。如例如#defineS(a,b)a*b……

5、area=S(3,2);则宏展开后得:area=3*2;例例8.3#definePI3.1415926#defineS(r)PI*r*rvoidmain(){floata,area;a=3.6;area=S(a);area=3.145926*a*a;printf(“r=%farea=%f”,a,area);}宏展开后如果程序中有带实参的宏,则按#define命令中指定的字符串从左至右进行置换。串中如包含有宏中的参数,则将程序语句中相应的实参代替形参,如字符串中的字符不是参数字符,则保留。规则在例8.3中改成:

6、area=S(a+b);则宏展开后为:area=PI*a+b*a+b(不合本意)改成:#defineS(r)PI*(r)*(r)则:S(a+b)宏展开成PI*(a+b)*(a+b);重点如:#defineSᗻ(r)ᗻᗻPI*(r)*(r)……则:area=Sᗻ(a);宏展开成:area=(r)ᗻᗻPI*(r)*(r)ᗻ(a);重点三、带参数的宏与函数的区别1.函数调用时要先求实参表达式的值,然后带入形参,而带参的宏只是进行替换。例如2.函数调用是在程序运行时处理的,要分配临时内存单元,而宏展开是在编译时进行的,且展开

7、时不分配内存单元,也无返回值和值传递的概念。3.函数中存在实参和形参的类型问题,而宏不存在类型问题,因为宏名不是变量。例如4.一般情况下函数调用只能得到一个返回值,而用宏可以设法获得几个结果。5.宏替换只占用编译时间,不占用运行时间,而函数调用则要占用运行时间。如:S(a+b),在宏展开时并不求a+b的值。例如如:#defineCHAR1CHINA(字符)#definea3.6(数值)例如例8.4#definePI3.1415926#defineCIRCLE(R,L,S,V)L=2*PI*R;S=PI*R*R;V=4

8、.0/3.0*PI*R*R*Rmain(){floatr,l,s,v;scanf(“%f”,&r);CIRCLE(r,l,s,v);printf(“r=%6.2f,l=6.2f,s=%6.2f,v=%6.2f”,r,l,s,v);}l=2*3.1415926*r;s=3.1415926*r*r;v=4.0/3.0*3.1415926*r*r

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。