宏函数为什么使用do{...}while{0}包起来

在我们看内核源码或者库以及一些优秀的源码时,都会发现他们的宏函数是包括在do{…}while(0)内。具体的原因其实想想就能明白。

考虑下面一个特殊的例子。
宏函数的定义如下:

#define test(x) \
  a(x); \
  b(x);

如果在调用时是这样调用的:

if (judge)
  test(x);

那么展开之后就是:

if (judge):
  a(x);
b(x);

这时产生的效果可能就和你的本意不同了,因为b(x)无论怎样都会执行。

这是由于大括号产生的问题,那如果我们简单的给宏函数加上大括号而不用do{…}while(0)可以吗?
举例如下:

#define test(x)\
{ \
  a(x);\
  b(x);\
}

调用时:

if (judge)
  test(x);

展开之后:

if (judge)
{
  a(x);
  b(x);
};

这个时候就产生语法错误了,因为多了一个分号。

总结宏函数加do{…}while(0)其实并不是额外加了什么功能,只是为了保持宏函数实现的时候语意和我们所写的代码一致,防止大括号以及分号的干扰。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值