函数式宏定义的形式
#define name(identifier-list) sequence-of-tokens
其中identifier-list是参数名列表,sequence-of-tokens是函数语句;
正确使用函数式宏定义的要点
1. 左括号与宏名之间不能有空格。如果有空格,则定义变成不带参数的宏和以左括号开始的宏体。但是调用宏时,宏名和左括号之间或实际参数中可以出现空白。
2.正式参数名应为标识符,参数不能重名,可以采用空参数表。
#define getchar() getc(stdin)
3.函数式宏取多个实际参数作为正式参数。调用宏时,要写入名称、左括号、每个正式参数的实际参数记号序列和右括号。实际参数序列用逗号隔开。
4.实际参数记号序列可以包含括号,但要正确嵌套和平衡;可以包含逗号,但每个逗号出现在一组括号中(避免与分隔实际参数的逗号混淆)。宏参数中也可以出现花括号和下标方括号,但不能包含逗号,也不需要平衡。字符型常量与字符串型常量记号中的括号和逗号不计入括号平衡和分隔实际参数的逗号。
#define sum(x,y) ((x)*(y))
sum( f(a,b), g(a,b)); /*true*/
5.重点:调用宏函数时,在函数后加上分号导致报错问题,用do-while来吸收分号、
/*例如下面这样定义宏函数swap*/
#define swap(x,y) { unsigned long _temp = x; x=y; y=_temp; }
/*问题是,我们习惯在函数调用后加上分号;*/
if (x>y) swap(x,y);
else x=y;
/*宏展开后就很容易发现出错*/
if (x>y)
{
unsigned long _temp=x;
x=y;
y=_temp;
}
; /*;多余*/
else
x=y;
/*要避免这个问题,我们可以用do-while语句,吸收多余的分号*/
#define swap(x,y) do{unsigned long _temp = x; x=y; y=_temp; } while(0)
以上就是函数式宏定义的所有要点啦