【C语言】 函数式宏定义的正确使用

函数式宏定义的形式

#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)

以上就是函数式宏定义的所有要点啦

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值