c语言15 编译预处理

c语言15 编译预处理

ID:24369750

大小:194.50 KB

页数:16页

时间:2018-11-13

c语言15 编译预处理_第1页
c语言15 编译预处理_第2页
c语言15 编译预处理_第3页
c语言15 编译预处理_第4页
c语言15 编译预处理_第5页
资源描述:

《c语言15 编译预处理》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、C语言程序设计第13章编译预处理主要内容基本概念宏定义文件包含条件编译基本概念C语言与其他高级语言的一个重要区别是可以使用预处理命令和具有预处理的功能。C提供的预处理功能主要有以下三种:宏定义文件包含条件编译这些功能分别用宏定义命令、文件包含命令、条件编译命令来实现。为了与一般C语句相区别,这些命令以符号“#”开头。例如:#define#include§9.1宏定义不带参数的宏定义宏定义一般形式为:#define标识符字符串例如:#definePI3.1415926宏定义的作用是在本程序文件中用指定的标识符PI来代替“3.1415926”这

2、个字符串,在编译预处理时,将程序中在该命令以后出现的所有的PI都用“3.1415926”代替。这个标识符(名字)称为“宏名”在预编译时将宏名替换成字符串的过程称为“宏展开”。#define是宏定义命令。[例13.1]使用不带参数的宏定义#include#definePI3.1415926voidmain(){floatl,s,r,v;printf("inputradius:");scanf("%f",&r);l=2.0*PI*r;s=PI*r*r;v=4.0/3*PI*r*r*r;printf("l=%10.4fs=%

3、10.4fv=%10.4f",l,s,v);}inputradius:4↙1=25.1328s=50.2655v=150.7966(1)宏名一般习惯用大写字母表示,以便与变量名相区别。但这并非规定,也可用小写字母。(2)宏定义是用宏名代替一个字符串,只作简单置换,不作正确性检查。只有在编译已被宏展开后的源程序时才会发现语法错误并报错。(3)宏定义不是C语句,不必在行末加分号。如果加了分号则会连分号一起进行置换。(4)在进行宏定义时,可以引用已定义的宏名,可以层层置换。(5)宏定义是专门用于预处理命令的一个专用名词,它与定义变量的含义

4、不同,只作字符替换,不分配内存空间。说明:#include#defineR3.0#definePI3.1415926#defineL2*PI*R#defineSPI*R*Rvoidmain(){printf("L=%fS=%f",L,S);}运行情况如下:L=18.849556S=28.274333[例13.2]在宏定义中引用已定义的宏名带参数的宏定义作用:不仅进行简单的字符串替换,还要进行参数替换。带参数的宏定义一般形式为:#define宏名(参数表)字符串字符串中包含在括弧中所指定的参数#defineS(a,b

5、)a*barea=S(3,2);程序中用3和2分别代替宏定义中的形式参数a和b,用3*2代替S(3,2)。因此赋值语句展开为:area=3*2对带实参的宏(如S(3,2),则按#define命令行中指定的字符串从左到右进行置换。若串中包含宏中的形参(如a、b),则将程序中相应的实参(可以是常量、变量或表达式)代替形参。如果宏定义中的字符串中的字符不是参数字符(如a*b中的*号),则保留。这样就形成了置换的字符串。带参的宏定义的展开置换方式:#include#definePI3.1415926#defineS(r)PI*r

6、*rvoidmain(){floata,area;a=3.6;area=S(a);printf("r=%farea=%f",a,area);}r=3.600000area=40.715038[例13.3]使用带参的宏赋值语句“area=S(a);”经宏展开后为:area=3.1415926*a*a;(1)函数调用时,先求出实参表达式的值,然后代入形参。而使用带参的宏只是进行简单的字符替换。(2)函数调用是在程序运行时处理的,为形参分配临时的内存单元。而宏展开则是在编译前进行的,在展开时并不分配内存单元,不进行值的传递处理,也没有“返

7、回值”的概念。(3)对函数中的实参和形参类型要求一致。而宏名无类型,它的参数也无类型,宏定义时,字符串可以是任何类型的数据。(5)使用宏次数多时,宏展开后源程序变长,而函数调用不会使源程序变长。(6)宏替换不占运行时间,只占编译时间。而函数调用则占运行时间(分配单元、保留现场、值传递、返回)。带参数的宏和函数的区别:写出程序的运行结果#defineN2#defineMN+1#defineNUM2*M+1main(){inti;for(i=1;i<=NUM;i++);printf("%d",i);}#defineMAX(x,y)(x)>(

8、y)?(x):(y)main(){inta=1,b=2,c=3,d=4,t;t=MAX(a+b,c+d)*10printf("%d",t);}所谓“文件包含”处理是指一个源文

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

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

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