不带参宏定义的一般形式: # define宏名宏体 宏名一般用大写,以区别于其他变量 宏体是字符串,可以是常数、常量表达式或语句。 作用:预处理时,进行宏替换,即用宏体代替宏名。 注意 1)一行只能写一个宏定义语句 2)宏名的起名规则同标识符的起名规则。 3)宏定义命令不是语句,末尾不需加分号(;) 例求圆的周长、面积中用3.14代替PI.(略)
不带参宏定义的一般形式: #define 宏名 宏体 宏名一般用大写,以区别于其他变量; 宏体是字符串,可以是常数、常量表达式或语句。 作用:预处理时,进行宏替换,即用宏体代替宏名。 注意: 1)一行只能写一个宏定义语句 2) 宏名的起名规则同标识符的起名规则。 3) 宏定义命令不是语句,末尾不需加分号(;) 例求圆的周长、面积中用3.14代替PI.(略)
宏定义的嵌套: #define one 1 #define TWo (OnEone #define THREE(TWo+one) 若原程序中有如下语句: printf(9d,%d,%d”,ONE,TWO, THREE);则预处理后为: printf(“%d,%d,%d”,1,(1+1),(1+1)+1); 结论:宏替换只是简单的用宏体字符串代替宏名,并不进行计算。 因为计算是在执行程序时进行的,而宏替换是编译之前进行的。 特别提示:宏体一般用括号括起来,避免宏替换后改变原来的运 算顺序 如:# define n10 define m n+4 语句:M*5替换后为:10+4*5(与原运算顺序不符)
宏定义的嵌套: #define ONE 1 #define TWO (ONE+ONE) #define THREE (TWO+ONE) 若原程序中有如下语句: printf(“%d,%d,%d”,ONE,TWO,THREE); 则预处理后为: printf(“%d,%d,%d”,1,(1+1),((1+1)+1)); 结论:宏替换只是简单的用宏体字符串代替宏名,并不进行计算。 因为计算是在执行程序时进行的,而宏替换是编译之前进行的。 特别提示:宏体一般用括号括起来,避免宏替换后改变原来的运 算顺序。 如:#define N 10 #define M N+4 语句:M*5 替换后为: 10+4*5 (与原运算顺序不符)
带参宏定义 常用于实现简单的操作,与函数功能类似 例92求三树种的最大值。其中,求两数中的较大数 用宏定义实现。 #define maX(a, b) (a>b)?(a):(b) main intx=10,y=20,z30; int t t=MAX(x,y);/预处理后:t=(x>y)?(x):(y);* printf(n %od, MAX(t, 2); /预处理后:prin(n%d”(t>n)?(t):(z);*
二、带参宏定义 ◼ 常用于实现简单的操作,与函数功能类似。 ◼ 例9.2 求三树种的最大值。其中,求两数中的较大数 用宏定义实现。 #define MAX(a,b) (a>b)?(a): (b) main() {int x=10, y=20, z=30; int t; t=MAX(x , y); /*预处理后: t=(x>y)?(x): (y); */ printf(“\n%d”,MAX(t , z)); /*预处理后: printf(“\n%d”,(t>z)?(t): (z)); */ }
带参宏定义的一般形式: # define宏名(参数表)宏体 预处理时进行如下宏替换 用宏体替换宏名的同时,用实参分别替换形参, 而不是用实参的值,即替换时不进行任何计算。 本例中的语句:t=MAX(x,y); 若理解为:t=(10>20)(10):(20);则错
带参宏定义的一般形式: #define 宏名(参数表) 宏体 预处理时进行如下宏替换: 用宏体替换宏名的同时,用实参分别替换形参, 而不是用实参的值,即替换时不进行任何计算。 本例中的语句: t=MAX(x , y); 若理解为:t=(10>20)?(10): (20); 则错