资源描述:
《C语言程序设计第九章课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、C语言程序设计主讲:龚文引第九讲:预处理命令提纲宏定义基本概念C语言与其他高级语言的一个重要区别是可以使用预处理命令和具有预处理的功能C提供的预处理功能主要有以下三种:1.宏定义2.文件包含3.条件编译这些功能分别用宏定义命令、文件包含命令、条件编译命令来实现。为了与一般C语句相区别,这些命令以符号”#”开头。例如:#define,#include9.1宏定义9.1.1不带参数的宏定义一般形式:#define标识符字符串例如:#definePI3.1415926作用是在本程序文件中用指定的标识符PI来代替“3.1415926”这个字符串,在编译预处
2、理时,将程序中在该命令以后出现的所有的PI都用“3.1415926”代替。这种方法使用户能以一个简单的名字代替一个长的字符串9.1宏定义例:使用不带参数的宏定义#include#definePI3.1415926voidmain(){floatl,s,r,v;printf("inputradius:");scanf("%f",&r);l=2.0*PI*r;s=PI*r*r;v=4.0/3*PI*r*r*r;printf("l=%10.4fs=%10.4fv=%10.4f",l,s,v);}9.1宏定义9.1.1不带参数
3、的宏定义说明:宏名一般习惯用大写字母表示,以便与变量名相区别。但这并非规定,也可用小写字母使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量宏定义是用宏名代替一个字符串,只作简单置换,不作正确性检查。只有在编译已被宏展开后的源程序时才会发现语法错误并报错9.1宏定义9.1.1不带参数的宏定义说明:宏定义不是C语句,不必在行末加分号。如果加了分号则会连分号一起进行置换#define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。通常,#define命令写在文件开头,函数之前,作为文件一部分,在此文件范围内有效可以
4、用#undef命令终止宏定义的作用域在进行宏定义时,可以引用已定义的宏名,可以层层置换9.1宏定义#define…#undef举例#defineG9.8voidmain(){…}#undefGf1(){…}G的作用范围在f1函数中,G不再代表9.8.这样可以灵活控制宏定义的作用范围9.1宏定义例:在宏定义中引用已定义的宏名#include#defineR3.0#definePI3.1415926#defineL2*PI*R#defineSPI*R*Rvoidmain(){printf("L=%fS=%f",L,S);}L=
5、18.849556S=28.274333经过宏展开后,printf函数中的输出项L被展开为:2*3.1415926*3.0S展开为3.1415926*3.0*3.09.1宏定义9.1.1不带参数的宏定义对程序中用双撇号括起来的字符串内的字符,即使与宏名相同,也不进行置换例如:printf(“PI=%f”,PI);则输出结果为:PI=3.141593宏定义是专门用于预处理命令的一个专用名词,它与定义变量的含义不同,只作字符替换,不分配内存空间9.1宏定义#include#defineFx+yvoidmain(){intx=3,y
6、=5,z;z=2*F;printf("%d",z);}11#include#defineF(x+y)voidmain(){intx=3,y=5,z;z=2*F;printf("%d",z);}169.1宏定义9.1.2带参数的宏定义作用:不是进行简单的字符串替换,还要进行参数替换一般形式:#define宏名(参数表列)字符串字符串中包含在括弧中所指定的参数#defineS(a,b)a*b...area=S(3,2);程序中用3和2分别代替宏定义中的形式参数a和b,用3*2代替S(3,2)。因此赋值语句展开为:area=3*
7、29.1宏定义带参的宏定义过程对带实参的宏(如S(3,2)),则按#define命令行中指定的字符串从左到右进行置换。若串中包含宏中的形参(如a、b),则将程序中相应的实参(可以是常量、变量或表达式)代替形参。如果宏定义中的字符串中的字符不是参数字符(如a*b中的*号),则保留。这样就形成了置换的字符串9.1宏定义带参宏定义说明:对带参数的宏展开只是将语句中的宏名后面括号内的实参字符串代替#define命令行中的形参#include#defineS(a,b)a*bvoidmain(){printf(“%d”,S(2+3,3+5
8、));}#include#defineS(a,b)(a)*(b)voidmain(){printf(“%