C语言程序设计(姜学峰版)第九章.ppt
《C语言程序设计(姜学峰版)第九章.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计(姜学峰版)第九章.ppt(28页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第九章第九章 编译预处理编译预处理 宏定义宏定义 文件包含文件包含处理处理1概述概述1.TurboC的编译过程的编译过程TC整个编译过程分两步:编译预处理和正式编译;编译预处理根据编译预处理命令进行;正式编译在预处理的基础上进行,包括词法、语法分析和目标代码的生成。由于TC采用单趟扫描编译,因而在发出编译命令后,编译预处理和正式编译一次完成,其间不会产生预处理后的中间文件。22.预处理命令的分类预处理命令的分类主要有三类:宏定义文件包含条件编译(改善程序的可移植性)3.预处理命令的使用要求预处理命令的使用要求1)以#号打头;2)不是C语句,而不必以分号结束;3)通常书写在函数之外、源文件开头;
2、3 宏定义宏定义用一个标识符来代表一个字符串;宏定义分为不带参数和带参数的宏定义。1.无参宏定义无参宏定义一般形式:#define宏名宏字符串其中:1)define是宏定义命令名;2)宏名按C标识符命名规则命名,通常字母大写;3)宏串是不加双引号的字符序列;4)当宏串为数字串时,宏名又称为符号常量。4作用:在编译预处理阶段,将定义点之后的宏名全部用宏串替换;替换过程也称为宏展开。意义:1)便于参数的修改,一改全改;2)一次定义可多处引用。5例:输入半径r,求圆周长和圆面积。#main()floatr,c,s;printf(Enterradius:);scanf(%f,&r);c=2.0*PI*
3、r;/*展开后:c=2.0*3.141592*r;*/s=PI*r*r;/*展开后:s=3.141592*r*r;*/printf(C=%-10.2fnS=%-10.2fn,c,s);Enterradius:16使用说明:1)利用TC的预处理实用程序CPP.EXE,可仅完成预编译并产生预编译的中间文件,其扩展名为.i对上例:执行程序对进行预处理:C:TC30CPPC:ZYCCPRGEXA91.C显示预编译中间文件的内容:C:TC30TYPEEXA91.I72)一个宏命令只能定义一个宏名;3)宏串中的每个字符都是有效字符;下例多余字符均导致编译出错:#definePI3.141592宏展开结果:
4、c=2.0*3.141592*r;#definePI3.141592;宏展开结果:c=2.0*3.141592;*r;84)宏定义可书写在函数之外的任何位置;一个宏名的有效范围是定义点开始直到本源文件结束;但可利用宏终止命令加以限定;如:#main()宏名G有效;fun1()main、fun1可引用。#undefGfun2()95)字符串中与宏名相同的字符不被替换;6)宏串中可出现已定义的宏名,这种现象称为宏的嵌套定义;如:#defineC2.0*PI*R#defineSPI*R*Rmain()printf(C=%fnS=%fn,C,S);最终输出项CS10例:一程序多处使用相同的输入提示、多
5、处使用相同的输出格式字符串,为减少书写量,使用宏定义来实现。#definePROMPTprintf(Pleaseinputdata:)#defineFORMATResult:%d,%d,%d,%dnmain()inta,b,c,d,e,f;PROMPT;/*宏引用*/scanf(%d,%d,%d,&a,&b,&c);PROMPT;scanf(%d,%d,%d,&d,&e,&f);printf(FORMAT,a,b,c,a+b+c);printf(FORMAT,d,e,f,d+e+f);112.带参数的宏定义带参数的宏定义定义一般形式:#define宏名(形参字串表)宏串带参的宏引用:宏名(实参
6、字串表)其中:1)形参字串应是宏串的子字串,长度可为1或更大;2)实参字串应与形参字串个数相同;带参的宏展开过程:在宏串替换宏引用的过程中,将宏串从左到右逐一展开,遇到与形参相同的字符串,则用对应的实参字符串顶替,遇到其它字符则按顺序正常展开。12例:计算以a、b为半径的圆面积之和及以a、b之和为半径的圆面积。#defineS(r)3.141592*r*rmain()floata=2.0,b=3.0,area1,area2,area3;area1=S(a);/*area1=3.141592*a*a;*/area2=S(b);/*area2=3.141592*b*b;*/area3=S(a+b)
7、;/*area3=3.141592*(a+b)*(a+b);*/printf(Totalarea:%-7.2fn,area1+area2);printf(R:%-7.2fCirclearea:%-7.2fn,a+b,area3);13带参的宏使用说明:1)带参的宏展开过程中出现的实参顶替形参是字符的顶替,而不是值的顶替;如上例宏引用S(a):实参字符a顶替形参字符r,不是ar;上例宏引用S(a+b):实参字符串(a+b)顶替形参字符r;2)为了保证宏展开的结果符合设计本意,应在宏串或实参字串中加入必要的括号;如:#defineS(r)3.141592*(r)*(r)143)宏定义中宏名与参数的
8、括号间不能有空格;如:#defineS(r)3.141592*(r)*(r)宏串由于出现了空格,则认为S是宏名而且无参。4)TC对宏串中双引号范围内的内容不予替换;如:#definePR(V)printf(V=%dt,V);main()inta=1,b=2;PR(a);/*printf(V=%dt,a);*/PR(b);/*printf(V=%dt,b);*/15例:计算四边形的面积。#includemath.h#defineAREA(s,a,b,c)sqrt(s*(s-a)*(s-b)*(s-c)floatfun(floatx,floaty,floatz)floatarea,t;t=S(x,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 姜学峰版 第九
限制150内