c语言——第07章预处理

上传人:san****019 文档编号:70163922 上传时间:2019-01-16 格式:PPT 页数:28 大小:287KB
返回 下载 相关 举报
c语言——第07章预处理_第1页
第1页 / 共28页
c语言——第07章预处理_第2页
第2页 / 共28页
c语言——第07章预处理_第3页
第3页 / 共28页
c语言——第07章预处理_第4页
第4页 / 共28页
c语言——第07章预处理_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《c语言——第07章预处理》由会员分享,可在线阅读,更多相关《c语言——第07章预处理(28页珍藏版)》请在金锄头文库上搜索。

1、,第7章,预处理命令,主要内容,7.1 概述 7.2 宏定义 7.3“文件包含”处理,7.1 概述,合理地使用预处理功能可以程序便于阅读、修改、移植和调试,也有利于模块华程序设计。,以“#”号开头的预处理命令,如#include,宏定义命令#define等,这些预处理命令放在函数之外,一般放在源文件的前面,称为预处理部分。,7.2 宏定义,7.2.1 无参宏定义,宏定义一般形式为:,define 标识符 字符串 例如:define PI 3.1415926,宏定义的作用是在本程序文件中用指定的标识符PI来代替“3.1415926”这个字符串,在编译预处理时,将程序中在该命令以后出现的所有的PI

2、都用“3.1415926”代替。这种方法使用户能以一个简单的名字代替一个长的字符串. 这个标识符(名字)称为“宏名” 在预编译时将宏名替换成字符串的过程称为宏替换或宏展开. define是宏定义命令。,【例7.1】 不带参数宏的使用,(1) 宏名一般习惯用大写字母表示,以便与变量名相区别。但这并非规定,也可用小写字母。 (2) 使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量。 宏定义是用宏名代替一个字符串,只作简单置换,不作正确性检查。如有错误,只能在编译已被宏展开后的源程序时发现。,说明:,(3) 宏定义不是说明或语句,不必在行末加分号。如果加了分号则会连分号一起进行置换。

3、 (4) define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。通常,define命令写在文件开头,函数之前,作为文件一部分,在此文件范围内有效。 可以用 undef命令终止宏定义的作用域。,说明:,#define G 9.8 _ void main() G的有效范围 - #undef G f1() ,在f1函数中,不再代表9.8。这样可以灵活控制宏定义的作用范围。,(5) 宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换。,说明:,【例7.2】 #define OK 100 void main() printf(“OK“); printf(“n“); ,

4、(6) 宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名,在宏展开时由预处理程序层层代换。,说明:,例如: # define PI 3.1415926 # define S PI*y*y 对语句 printf(“%f”,S); 在宏替换后变为: printf(“%f”,3.1415926*y*y);,(7) 对“输出格式”作宏定义,可以减少书定麻烦。,说明:,【例7.3】中就采用了(7)那种方法。 #include #define P printf #define D “%dn“ #define F “%fn“ void main() int a=5, c=8, e=11; float

5、 b=3.8, d=9.7, f=21.08; P(D F,a,b); P(D F,c,d); P(D F,e,f); ,执行结果: 5 3.800000 8 9.700000 11 21.080000,下面叙述中正确的是( )。 A. 宏定义是C语句,所以要在行末加分号 B. 可以使用#undef命令来终止宏定义的作用域 C. 在进行宏定义时,宏定义不能层层嵌套 D. 对程序中用双引号括起来的字符串内的字符,与宏名相同的要进行置换,B,7.2.2 带参数的宏定义,作用:不是进行简单的字符串替换,还要进行参数替换。,带参数的宏定义一般形式为:,define 宏名(形参表) 字符串,带参宏调用的

6、一般形式为:,宏名(实参表);,其中:,宏名同不带参的宏名,习惯用大写字母。 形参表由一个或多个参数构成,注意形参与函数形参的区别:参数只有参数名,没有数据类型,只作替换,不分配内存空间。,例如: #define M(y) y*y+3*y k=M(5); 在宏调用时,用实参代替形参y,经预处理宏展开后的语句为: K=5*5+3*5,【例7.4】带参宏替换,执行结果: Input two numbers: 8 6 Max=8,(1)带参的宏定义中,宏名和形参表之间不能有空格出现。,说明:,例如: # define MAX(a,b) (ab)?a:b 如果写为: # define MAX (a,b

7、) (ab)?a:b 将为认为是无参定义,宏名MAX代表字符串 (a,b) (ab)?a:b。宏展开时,宏调用语句: max=MAX(x,y); 将变为: max= (a,b) (ab)?a:b(x,y);,(2)函数调用是在程序运行时处理的,为形参分配临时的内存单元。而宏展开则是在编译前进行的,在展开时并不分配内存单元,不进行值的传递处理,也没有“返回值”的概念。 对函数中的实参和形参类型要求一致。而宏名无类型,它的参数也无类型,只是一个符号代表,展开时代入指定的字符串即可。宏定义时,字符串可以是任何类型的数据。 (3)在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。,说明:,【例7

8、.5】表达式作为宏调用的实参,执行结果: Input a number : 5 sq=36,(4)在宏定义中,字符串内的形参通常要用括号括起来以避免出错。在上例中的宏定义中(y)*(y)表达式的y都用括号括起来,因此结果是正确的。如果去掉括号,把程序改为例7.6所示的形式。,说明:,【例7.6】 进行宏替换的一个典型例子,执行结果: Input a number : 5 sq=11,(5)带参的宏和带参函数很相似,但在本质上是不同的,把同一表达式用函数处理与用宏处理两者的结果有可能是不同的。,说明:,【例7.7】带参的函数和带参的宏的区别,执行结果: 1 4 9 16 25,执行结果: 1 9

9、 25,下列程序执行后的输出结果是( )。 #define MA(x) x*(x-1) main() int a=1,b=2; printf(“%d n“,MA(1+a+b); ,8,下列程序执行后的输出结果是( )。 #define MA(x) x*(x-1) main() int a=1,b=2; printf(“%d n“,MA(1+a+b); ,12,以下程序执行的输出结果是( )。 #define MIN(x,y) (x)(y)?(x):(y) void main() int i,j,k; i=10;j=15; k=10*MIN(i,j); printf(“%dn“,k); ,15,

10、下面程序的运行结果是_。 #define N 10 #define s(x) x*x #define f(x) (x*x) main() int i1,i2; i1=1000/s(N); i2=1000/f(N); printf(“%d,%dn“,i1,i2); ,1000,10,其一般形式为: #include “文件名“ 或 #include ,7.3 文件包含,这两种形式是有区别的: 使用尖括号表示在包含文件目录中去查找 (包含目录是由用户在设置环境时设置的),而不在源文件目录去查找; 使用双引号则表示首先在当前的源文件目录中查找,若未找到才到包含目录中去查找。用户编程时可根据自己文件所在的目录来选择某一种命令形式。,一个include命令只能指定一个被包含文件,若隐若现多个文件要包含,则需用多个include命令。 文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件。,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号