- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C语言程序设计(姜学峰版)PPT第九章
第九章 编译预处理
9.1 宏定义
9.2 文件包含处理;概述
1. Turbo C的编译过程
TC整个编译过程分两步:编译预处理和正式编译;
编译预处理——根据编译预处理命令进行;
正式编译——在预处理的基础上进行,包括词法、
语法分析和目标代码的生成。
由于TC采用单趟扫描编译,因而在发出编译命
令后,编译预处理和正式编译一次完成,其间不会
产生预处理后的中间文件。;;9.1 宏定义
用一个标识符来代表一个字符串;
宏定义分为不带参数和带参数的宏定义。
1. 无参宏定义
一般形式:#define 宏名 宏字符串
其中:
1)define是宏定义命令名;
2)宏名按C标识符命名规则命名,通常字母大写;
3)宏串是不加双引号的字符序列;
4)当宏串为数字串时,宏名又称为符号常量。;作用:
在编译预处理阶段,将定义点之后的宏名全部
用宏串替换;替换过程也称为宏展开。
意义:
1)便于参数的修改,一改全改;
2)一次定义可多处引用。 ;例:输入半径r,求圆周长和圆面积。
#define PI 3.141592
main( )
{ float r, c, s;
printf(Enter radius:);
scanf(%f, r);
c=2.0*PI*r; /*展开后: c=2.0*3.141592*r;*/
s=PI*r*r; /*展开后: s=3.141592*r*r;*/
printf(C=%-10.2f\nS=%-10.2f\n, c, s);
}
Enter radius: 1↙
C=6.28
S=3.14;使用说明:
1)利用TC的预处理实用程序CPP.EXE,可仅完成预
编译并产生预编译的中间文件,其扩展名为.i
对上例:
执行CPP.EXE程序对EXA91.C进行预处理:
C:\TC30CPP C:\ZYC\CPRG\EXA91.C↙
显示预编译中间文件的内容:
C:\TC30TYPE EXA91. I ↙
;2)一个宏命令只能定义一个宏名;
3)宏串中的每个字符都是有效字符;
下例多余字符均导致编译出错:
#define PI 3.141592
宏展开结果:c=2.0*3.141592*r;
#define PI 3.141592;
宏展开结果:c=2.0*3.141592; *r; ;4)宏定义可书写在函数之外的任何位置;一个宏名
的有效范围是定义点开始直到本源文件结束;但
可利用宏终止命令加以限定;
如:#define G 9.8
main( )
{ …… } 宏名G有效;
fun1(…) main、fun1可引用。
{ …… }
#undef G
fun2(…)
{ …… } ;5)字符串中与宏名相同的字符不被替换;
6)宏串中可出现已定义的宏名,这种现象称为宏的
嵌套定义;
如:#define R 3.0
#define PI 3.141592
#define C 2.0*PI*R
#define S PI*R*R
main( )
{ printf(C=%f\nS=%f\n, C, S); }
最终输出项C替换为:2.0*3.141592*3.0
S替换为:3.141592*3.0*3.0;例:一程序多处使用相同的输入提示、多处使用相
同的输出格式字符串,为减少书写量,使用宏
定义来实现。
#define PROMPT printf(Please input data:)
#define FORMAT Result: %d,%d,%d,%d\n
main( )
{ int a, 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+
文档评论(0)