第九章编译预处理
第九章 编译预处理
第一节宏定义 1.不带参数的宏定义 般形式: # define宏名字符串 其中,“#”表示一条预处理命令,“ define”为 宏定义命令 “宏名”为一个合法的标示 “字符串”可以是常数、表达式、语句等 tH: #define Pi 3. 1415926
第一节 宏定义 1.不带参数的宏定义 一般形式: #define 宏名 字符串 其中,“#”表示一条预处理命令,“define”为 宏定义命令, “宏名”为一个合法的标示符 “字符串”可以是常数、表达式、语句等 如: #define PI 3.1415926
例:一个简单的宏定义 #define e 2.71427 # include“math.h” ma in float sum sum=sqrt(E)+E+E*E+E*E*E十E*E米; printf(“%f”,sum); 若要把E的值改为2.71427
例: 一个简单的宏定义 #define E 2.71828 #include “math.h” main() { float sum; sum=sqrt(E)+E+E*E+E*E*E+E*E*E*E; printf(“%f”,sum); } 若要把E的值改为2.71427 2.71427
关于不带参数的宏定义使用的说明 (1)#与 define之间一般不留空格,但宏名两边 必须有空格 (2)宏名习惯采用大写字母表示,以与变量名 区别,但也可以是小写 (3)宏定义与变量定义含义不同,宏定义只做 简单的置换,并不分配内存空间 (4)宏定义用宏名代替一个字符串,是一种机 械的置换,不做任何语法检查 如:# define a3.059
关于不带参数的宏定义使用的说明: (1)#与define之间一般不留空格,但宏名两边 必须有空格 (2)宏名习惯采用大写字母表示,以与变量名 区别,但也可以是小写 (3)宏定义与变量定义含义不同,宏定义只做 简单的置换,并不分配内存空间 (4)宏定义用宏名代替一个字符串,是一种机 械的置换,不做任何语法检查 如: #define A 3.o59
关于不带参数的宏定义使用的说明 (5)因为不是C语言,所以宏定义结尾不用加 5如:# define p2.7189 sum=P*kP sum2.7189;*2.7189;; (6)宏定义的嵌套使用 tH: #define PI 3. 1415926 tdefine r5. 5 tdefine circle 2.0* Pi= r # define AREA pi*R米R
关于不带参数的宏定义使用的说明: (5)因为不是C语言,所以宏定义结尾不用加 “ ; ” 如: #define P 2.7189; … … sum=P*P; sum=2.7189;*2.7189;; (6)宏定义的嵌套使用 如: #define PI 3.1415926 #define R 5.5 #define CIRCLE 2.0* PI* R #define AREA PI* R * R
关于不带参数的宏定义使用的说明 (7)宏名的有效范围为从定义之处到本源文件 结束。习惯上,# define写在程序最前面 (8)宏名出现在一对双引号中,将不会产生置 换 如:# define p2.7189 main o printf(“P=%d”,P) 结果:P=2.7189
关于不带参数的宏定义使用的说明: (7)宏名的有效范围为从定义之处到本源文件 结束。习惯上,#define写在程序最前面 (8)宏名出现在一对双引号中,将不会产生置 换 如: #define P 2.7189 main() { printf(“P=%d”, P); } 结果:P=2.7189
关于不带参数的宏定义使用的说明 (9)宏定义还可以定义运算符、表达式、甚至 可以把格式语句作为宏定义 如:# define r3.5 # define area3.1415926米R米R *define p printf # define f“%f\n main P(F, AREA) 结果:38.484509
关于不带参数的宏定义使用的说明: (9)宏定义还可以定义运算符、表达式、甚至 可以把格式语句作为宏定义 如: #define R 3.5 #define AREA 3.1415926*R*R #define P printf #define F “%f\n” main() { P(F,AREA); } 结果:38.484509
2.带参数的宏定义 般形式: # define宏名(参数表)字符串 如:# define area(x,y)x米 total=AREA (3. 6) tota1=3米6 area=AREA (3*3, 7/2) area=3*3*7/2; 如:# define p(a,b)a*b area=P(3+4,5+6); area=3+4*5+6;
2. 带参数的宏定义 一般形式: #define 宏名(参数表) 字符串 如: #define AREA(x,y) x*y … total=AREA(3,6); area=AREA(3*3,7/2); … total=3*6; area=3*3*7/2; 如: #define P(a,b) a*b … area= P(3+4,5+6); area=3+4*5+6;
关于带参数的宏定义使用的说明: (1)在定义带参数的宏时,字符串内的参数通 常要用括号括起来,以避免出错 4H: #define P(a, b) (a)*(b) area=P(3+4,5+6); (2)宏名与形参表之间不能有空格 如:# tdefine p(a,b)a*b
关于带参数的宏定义使用的说明: (1)在定义带参数的宏时,字符串内的参数通 常要用括号括起来,以避免出错 如: #define P(a,b) (a)*(b) … area= P(3+4,5+6); (2)宏名与形参表之间不能有空格 如: #define P (a,b) a*b
关于带参数的宏定义使用的说明: (3)带参数的宏与带参数的函数区别: 带参数的宏 带参数的函数 在编译预处理之前,在程序运行时进行, 不占运行时间 占用运行时间 只占编译时间 只是简单、机械的 字符串置换 单向的值传通过程「 宏名无类型, 形参、实参要求 宏参也无类型 类型一致
关于带参数的宏定义使用的说明: (3)带参数的宏与带参数的函数区别: 在编译预处理之前, 不占运行时间, 只占编译时间 在程序运行时进行, 占用运行时间 带参数的宏 带参数的函数 只是简单、机械的 字符串置换 单向的值传递过程 宏名无类型, 宏参也无类型 形参、实参要求 类型一致