第7章编译预处理.ppt

上传人:本田雅阁 文档编号:2120920 上传时间:2019-02-18 格式:PPT 页数:14 大小:167.01KB
返回 下载 相关 举报
第7章编译预处理.ppt_第1页
第1页 / 共14页
第7章编译预处理.ppt_第2页
第2页 / 共14页
第7章编译预处理.ppt_第3页
第3页 / 共14页
亲,该文档总共14页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第7章编译预处理.ppt》由会员分享,可在线阅读,更多相关《第7章编译预处理.ppt(14页珍藏版)》请在三一文库上搜索。

1、,第七章,编译预处理,所谓预处理是指,在对源程序进行编译之前,先对源程序中的预处理命令(主要指宏定义命令、文件包含命令和条件编译命令)进行处理;然后再将处理的结果,和源程序一起进行编译,以得到目标代码。,预处理,宏定义 文件包含 条件编译,define #include,为了和一般C语句相区别,这些命令以符号#开头。,7.1.1 不带参数的宏定义(简单替换),用标识符来代表一个字符串(给字符串取个名字)。C语言用“#define”进行宏定义。C编译系统在编译前将这些标识符替换成所定义的字符串。,概念,格式,define 标识符 字符串,相关概念,宏名:宏定义中的标识符称为“宏名”。 宏展开:在

2、预编译时将宏名替换成字符串的过程称 为“宏展开”。,#define PI 3.1415926,7.1 宏定义,#include #define PI 3.1415926 void main( ) float radius,length,area,volume; printf(“Input a radius: “); scanf(“%f“, ,例7.1 输入圆的半径,求圆的周长、面积和球的体积。要求使用无参宏定义圆周率。,1、宏名遵循标识符规定,习惯用大写字母表示,以便区别普通的变量。 2、#define之间不留空格,宏名两侧空格(至少一个)分隔。 3、宏定义字符串不要以分号结束,否则分号也作为

3、字符串的一部分参加展开。从这点上看宏展开实际上是简单的替换。,说明,#define PI 3.14; area=PI*r*r;,area=3.14;*r*r;,4、宏定义是预处理指令,与定义变量不同,它只是进行简单的字符串替换,不分配内存。 5、宏定义用宏名代替一个字符串,并不管它的数据类型是什么,也不管宏展开后的词法和语法的正确性,只是简单的替换。是否正确,编译时由编译器判断。 例如: #define PI 3.I4 照样进行宏展开(替换),是否正确,由编译器来判断。 6、#define命令出现在程序中函数的外面,宏名的有效范围从定义命令开始直到本源程序文件结束。可以通过#undef终止宏名

4、的作用域。,#define G 9.8 #define PI 3.14 int f1( ) #undef G void main( ) ,7、宏定义时,可以引用已 定义的宏名,可以层层置换。 若宏名出现在双引号“”括起 来的字符串中时,将不会产 生宏替换。,#define R 3.0 #define PI 3.14 #define L 2*PI*R #define S PI*R*R void main() printf(“L=%fnS=%fn”,L,S); ,printf(“L=%fnS=%fn”,2*3.14*3.0 , 3.14*3.0*3.0);,7.1.2 带参数的宏定义,带参数的宏定

5、义不只是进行简单的字符串替换,还要进行参数替换。,格式,概念,define 宏名(参数表) 字符串,类似函数头,但是没有类型说明,参数也不要类型说明,展开置换规则,按照#define命令行中指定的“字符串”从左到右进行置换(扫描置换)。如果串中包含宏定义中的形参,则将程序中相应的实参代替形参,其它字符原样保留,形成了替换后的字符串。,举例,#define S(a,b) a*b area=S(3,2);,area=3*2;,例7. 2 用带参数的宏定义表示圆的面积。,#define PI 3.14 #define S(r) PI*r*r void main() float a,area; a=3

6、.6; area=S(a); printf(“r=%fnarea=%fn”,a,area); ,1、正因为带参宏定义本质还是简单字符替换(除了参数替换),所以容易发生错误。 例:define S(r) 3.14*r*r area=S(a+b);,说明,area=3.14*a+b*a+b;,不再是求面积了。,此时S是符号常量(不带参的宏名),它代表字符串“(r) 3.14*r*r”。,2、定义带参数宏时还应该注意宏名与参数表之间不能有空格。有空格就变成了不带参数的宏定义。 例:define S (r) 3.14*r*r,7.2 “文件包含”处理,概念,格式,#include “文件名”或 #in

7、clude ,所谓“文件包含”处理是指一个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中。,示意图,1、被包含的文件常常被称为“头文件”(#include一般写在文件的开头)。头文件常常以“.h”为扩展名(也可以用其它的扩展名,.h只是习惯或风格)。 2、一条#include只能包含一个头文件,如果要包含多个头文件,使用多条#include命令。 3、在一个被包含的文件中又可以包含另一个被包含文件,即文件包含是可以嵌套的。 4、被包含的头文件可以用“”括起来,也可以用括起来。区别在于: “”先在用户当前目录查找头文件,如果没找到,再到存放C库函数头文件的目录中查找

8、;而直接到存放C库函数头文件的目录中查找。 一般地说,使用双引号比较保险。 5、习惯上,用户头文件一般在用户目录下,所以常常用“”;系统库函数的头文件一般在系统指定目录下,所以常常用。,说明,概念:所谓“条件编译”,是对部分内容指定编译的条件,使其只在满足一定条件才进行编译。,条件编译命令的几种形式:,(1)ifdef 标识符 程序段 else 程序段 endif,(2)ifndef 标识符 程序段 else 程序段 endif,(3) if 表达式 程序段 else 程序段 endif,7.3 条件编译,例7.3 输入一行字母字符,根据需要设置条件编译,使之能将字母全改为大写输出,或全改为小写字母输出。,#include #define LETTER 1 void main( ) char str20=“C Language“,c; int i=0; while(c=stri)!=0) i+; #if LETTER if(c=a ,运行结果为: LANGUAGE,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1