C语言程序设计课件:编译预处理.ppt
编译预处理宏定义文件包含条件编译基本内容:宏定义宏定义:是用一个指定的名字来代表一个常量表达式或字符串,其复杂形式是带参数的宏。1.符号常量定义(1)程序中常用到一些特别的量,如用0或1作条件判别量,用-1表示文件结束,用2147483647表示最大4字节整数231-1等,它们都常定义成宏名。如:#defineNO0#defineYES1#defineEOF(-1)(2)宏名可定义为具有一定精度要求的float和double类型值。如:#definePI3.14159#defineEPS1.0e-9(3)宏名还可以定义为数组中最后一个元素的地址a[MAX-1]。如:#defineMAX100#defineMAXPa[MAX-1](4)利用宏定义还可以把C语言语句的书写格式写成程序员习惯的格式。如:预处理后:#definethenend{…#definebegin{elseif(ab) #defineend;}begin{a:=b;#define:==c:=b;d:=(a+b)/2;{...D:=(d*c)/2;}if(ab)thenendelse begin…{c:=b;a:=b;}d:=(a+b)/2; d:=(a+b)/2;}…}利用宏定义将C写成PASCAL的格式对于宏需要注意的问题:(1)宏名习惯上用大写字母表示,表示与一般变量名相区别。但这并非C语言的规定,也可以用小写字母。(2)宏定义不是C语句,不必在行末尾加分号。若加,则会连分号一些进行置换,可能会出现语法错误。(3)字符串或字符常量中若有与宏名重名的,预处理程序一律不将它们作为宏名对待,更不进行代换。例如:#defineYES1…printf(“YES\n”);输出的是YES,而不是1。(4)在宏定义中,可以引用已经定义的宏名,可以进行层层代换。例如:#definePI3.14159#defineR3.0#defineL2*PI*R#defineSPI*R*R(5)宏定义的有效范围为定义点到该源文件结束,还可以用#undef命令终止宏定义的作用域。例如:#defineP100main(){…}#undefPf1()…2.带参数的宏定义所谓带参数的宏定义是指宏名后带有形参表的宏定义。格式:#define宏名(形参表)表达式说明:宏定义中的形参在以后的程序中将以实参替换。置换过程:在程序中若有带参数的宏,则按#define命令行中指定的字符串从左到右进行置换。如果串中包含宏中的形式参数,则将程序语句中相应的实参(可以是常量、变量或表达式)代替形参,如果宏定义中的字符串中的字符不是参数字符,则原样保留。常见的带参数宏定义的用法:(1)带参数的宏定义常用来代替一些简短的表达式。例如:#defineMIN(x,y)((xy)?x:y)(2)带参数的宏定义也可以直接引用已定义过的宏定义,即实现宏定义的嵌套。例如:#defineSQ(x)(x*x)#defineFIFTH(x)CUBE(x)*(SQ(x))预处理程序对每个宏名展开代换,直到件中不再有宏名为止。(3)带参数的宏定义可以简化格式打印函数printf的格式,提高程序的可读性。例如:#defineNLputchar(‘\n’)