C语言-第07章预处理课件_第1页
C语言-第07章预处理课件_第2页
C语言-第07章预处理课件_第3页
C语言-第07章预处理课件_第4页
C语言-第07章预处理课件_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C语言-第07章预处理第7章C语言-第07章预处理l 主要内容主要内容7.1 7.1 概述概述7.2 7.2 宏定义宏定义7.3“7.3“文件包含文件包含”处理处理C语言-第07章预处理7.1 概述概述 合理地使用预处理功能可以程序便于阅读、合理地使用预处理功能可以程序便于阅读、修改、移植和调试,也有利于模块华程序设修改、移植和调试,也有利于模块华程序设计。计。 以以“#”号开头的预处理命令,如号开头的预处理命令,如#include,宏定义命令宏定义命令#define等,这些预处理等,这些预处理命令放在函数之外,一般放在源文件的前面,命令放在函数之外,一般放在源文件的前面,称为预处理部分。称为

2、预处理部分。C语言-第07章预处理7.2 宏定义宏定义7.2.1 无参宏定义无参宏定义宏定义一般形式为宏定义一般形式为: :define define 标识符标识符 字符串字符串例如:例如:define PI 3.1415926define PI 3.1415926 宏定义的作用是在本程序文件中用指定的标识符PI来代替“3.1415926”这个字符串,在编译预处理时,将程序中在该命令以后出现的所有的PI都用“3.1415926”代替。这种方法使用户能以一个简单的名字代替一个长的字符串. 这个标识符(名字)称为“宏名” 在预编译时将宏名替换成字符串的过程称为宏替换或宏展开. define是宏定义

3、命令。C语言-第07章预处理【例【例7.1】 不带参数宏的使用不带参数宏的使用程序员输入的源程序程序员输入的源程序 预处理(宏替换)后的新源程预处理(宏替换)后的新源程序序#include#define PI 3.1415926void main() float l,s,r,v; printf(input radius:); scanf(%f,&r); l=2.0*PI*r; s=PI*r*r; v=4.0/3*PI*r*r*r; printf(l=%10.4fn,l); printf(s=%10.4fn,s); printf(v=%10.4fn, v); #include void

4、main() float l,s,r,v; printf(input radius:); scanf(%f,&r); l=2.0*3.1415926*r; s=3.1415926*r*r; v=4.0/3*3.1415926*r*r*r; printf(l=%10.4fn,l); printf(s=%10.4fn,s); printf(v=%10.4fn, v); C语言-第07章预处理(1) (1) 宏名一般习惯用宏名一般习惯用大写字母大写字母表示,以便与变量名表示,以便与变量名相区别。但这并非规定,也可用小写字母。相区别。但这并非规定,也可用小写字母。(2) (2) 使用宏名代替一

5、个字符串,可以减少程序中重使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量。复书写某些字符串的工作量。 宏定义是用宏名代宏定义是用宏名代替一个字符串,替一个字符串,只作简单置换,不作正确性检查只作简单置换,不作正确性检查。如有错误,只能在编译已被宏展开后的源程序时如有错误,只能在编译已被宏展开后的源程序时发现。发现。C语言-第07章预处理(3) 宏定义不是说明或语句,不必在行末加分号。如果加了分号则会连分号一起进行置换。(4) definedefine命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。通常,definedefine命令写在文件开头,函数之前

6、,作为文件一部分,在此文件范围内有效。 可以用 undefdef命令终止宏定义的作用域。C语言-第07章预处理#define G 9.8 _ void main() G的有效范围 - #undef G f1() 在在f1f1函数中,不再代表函数中,不再代表9.89.8。这样可以灵活控制宏。这样可以灵活控制宏定义的作用范围。定义的作用范围。C语言-第07章预处理(5) (5) 宏名在源程序中若宏名在源程序中若用引号括起来用引号括起来,则预处理程序,则预处理程序不对其不对其作宏代换作宏代换。 【例【例7.27.2】#define OK 100void main() printf(OK); prin

7、tf(n);C语言-第07章预处理(6) (6) 宏定义允许嵌套,在宏定义的字符串中宏定义允许嵌套,在宏定义的字符串中可以使用已经定可以使用已经定义的宏名义的宏名,在宏展开时由预处理程序层层代换。,在宏展开时由预处理程序层层代换。 例如:例如:# define PI 3.1415926# define S PI*y*y对语句对语句printf(“%f”,S);在宏替换后变为:在宏替换后变为:printf(“%f”,3.1415926*y*y);C语言-第07章预处理(7) (7) 对对“输出格式输出格式”作宏定义,可以减少书定麻烦。作宏定义,可以减少书定麻烦。 【例【例7.3】中就采用了(】中

8、就采用了(7)那种方法。)那种方法。#include#define P printf#define D %dn#define F %fnvoid main() int a=5, c=8, e=11; float b=3.8, d=9.7, f=21.08; P(D F,a,b); P(D F,c,d); P(D F,e,f);执行结果:53.80000089.7000001121.080000C语言-第07章预处理下面叙述中正确的是(下面叙述中正确的是( )。)。A.A. 宏定义是宏定义是C C语句,所以要在行末语句,所以要在行末加分号加分号B.B. 可以使用可以使用#undef#undef命

9、令来终止宏定命令来终止宏定义的作用域义的作用域C.C. 在进行宏定义时,宏定义不能层在进行宏定义时,宏定义不能层层嵌套层嵌套D.D. 对程序中用双引号括起来的字符对程序中用双引号括起来的字符串内的字符,与宏名相同的要进串内的字符,与宏名相同的要进行置换行置换C语言-第07章预处理 7.2.2 带参数的宏定义带参数的宏定义 作用:作用:不是进行简单的字符串替换,还要进行不是进行简单的字符串替换,还要进行参数替换。参数替换。 带参数的宏定义一般形式为带参数的宏定义一般形式为: :define define 宏名(形参表)宏名(形参表) 字符串字符串 带参宏调用的一般形式为:带参宏调用的一般形式为:

10、宏名宏名( (实参表实参表) );C语言-第07章预处理其中: 宏名同不带参的宏名,习惯用大写字母。 形参表由一个或多个参数构成,注意形参与函数形参的区别:参数只有参数名,没有数据类型,只作替换,不分配内存空间。 例如: #define M(y) y*y+3*y k=M(5); 在宏调用时,用实参代替形参y,经预处理宏展开后的语句为: K=5*5+3*5C语言-第07章预处理【例【例7.47.4】带参宏替换】带参宏替换 程序员输入的源程序程序员输入的源程序 预处理(宏替换)后的新源程序预处理(宏替换)后的新源程序 #include #define MAX(a,b) (ab)?a:bvoid m

11、ain() int x,y,max; printf(input two numbers: ); scanf(%d%d,&x,&y); max=MAX(x,y); printf(max=%dn,max); #includevoid main() int x,y,max; printf(input two numbers: ); scanf(%d%d,&x,&y); max=(xy)?x:y; printf(max=%dn,max); 执行结果:Input two numbers: 8 6Max=8C语言-第07章预处理(1)(1)带参的宏定义中,宏名和形参表之间不

12、能有空格出现。带参的宏定义中,宏名和形参表之间不能有空格出现。例如:例如:# define MAX(a,b) (ab)?a:b如果写为:如果写为:# define MAX (a,b) (ab)?a:b将为认为是无参定义,宏名将为认为是无参定义,宏名MAX代表字符串代表字符串 (a,b) (ab)?a:b。宏展开时,宏调用语句:。宏展开时,宏调用语句:max=MAX(x,y);将变为:将变为: max= (a,b) (ab)?a:b(x,y);C语言-第07章预处理(2)(2)函数调用是在程序函数调用是在程序运行时处理运行时处理的,为形参分配临的,为形参分配临时的内存单元。而宏展开则是在时的内存

13、单元。而宏展开则是在编译前进行的编译前进行的,在,在展开时并不分配内存单元,不进行值的传递处理,展开时并不分配内存单元,不进行值的传递处理,也没有也没有“返回值返回值”的概念。的概念。 对函数中的对函数中的实参和形实参和形参类型要求一致参类型要求一致。而宏名无类型,它的。而宏名无类型,它的参数也无类参数也无类型,只是一个符号代表型,只是一个符号代表,展开时代入指定的字符串,展开时代入指定的字符串即可。宏定义时,即可。宏定义时,字符串可以是任何类型字符串可以是任何类型的数据。的数据。(3 3)在宏定义中的)在宏定义中的形参是标识符形参是标识符,而宏调用中的,而宏调用中的实实参可以是表达式参可以是

14、表达式。C语言-第07章预处理【例【例7.5】表达式作为宏调用的实参】表达式作为宏调用的实参 程序员输入的源程序程序员输入的源程序 预处理(宏替换)后的新源程预处理(宏替换)后的新源程序序 #include #define SQ(y) (y)*(y) void main() int a,sq; printf(input a number: ); scanf(%d,&a); sq=SQ(a+1); printf(sq=%dn,sq); #includevoid main() int a,sq; printf(input a number: ); scanf(%d,&a); sq=

15、(a+1)*(a+1); printf(sq=%dn,sq); 执行结果:Input a number : 5sq=36C语言-第07章预处理(4)(4)在宏定义中,字符串内的形参通常要用括在宏定义中,字符串内的形参通常要用括号括起来以避免出错。在上例中的宏定义中号括起来以避免出错。在上例中的宏定义中(y)(y)* *(y)(y)表达式的表达式的y y都用括号括起来,因此结都用括号括起来,因此结果是正确的。如果去掉括号,把程序改为例果是正确的。如果去掉括号,把程序改为例7.67.6所示的形式。所示的形式。C语言-第07章预处理【例【例7.67.6】 进行宏替换的一个典型例子进行宏替换的一个典型

16、例子 程序员输入的源程序程序员输入的源程序 预处理(宏替换)后的新源程预处理(宏替换)后的新源程序序 #include#define SQ(y) y*yvoid main() int a,sq; printf(input a number: ); scanf(%d,&a); sq=SQ(a+1); printf(sq=%dn,sq); #includevoid main() int a,sq; printf(input a number: ); scanf(%d,&a); sq=a+1*a+1; printf(sq=%dn,sq); 执行结果:Input a number :

17、5sq=11C语言-第07章预处理(5)(5)带参的宏和带参函数很相似,但在本质上带参的宏和带参函数很相似,但在本质上是不同的,把同一表达式用函数处理与用宏是不同的,把同一表达式用函数处理与用宏处理两者的结果有可能是不同的。处理两者的结果有可能是不同的。C语言-第07章预处理【例【例7.77.7】带参的函数和带参的宏的区别】带参的函数和带参的宏的区别 带参函数调用带参函数调用 带参的宏替换带参的宏替换#includevoid main() int SQ(int y); int i=1; while(i=5) printf(%dn,SQ(i+);int SQ(int y) return(y)*(

18、y); #include#define SQ(y) (y)*(y)void main() int i=1; while(i=5) printf(%dn,SQ(i+); 执行结果:1491625执行结果:1925C语言-第07章预处理下列程序执行后的输出结果是( )。 #define MA(x) x*(x-1) main() int a=1,b=2; printf(%d n,MA(1+a+b);C语言-第07章预处理下列程序执行后的输出结果是( )。 #define MA(x) x*(x-1) main() int a=1,b=2; printf(%d n,MA(1+a+b);C语言-第07章预处理以下程序执行的输出结果是( )。 #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);C语言-第07章预处理下面程序的运行结果是下面程序的运行结果是_。 #define N 10#define N 10#define s(x) x#define s(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论