又见do{...}while(0)

今天碰到一个判断错误返回的宏,IF_FAILED_RETURN_XXX(result),之前没有细究,顾名思义地使用着,而今天特地进去看了下,发现该宏如下:

#define IF_FAIL_RETURN_XXX(result) \ do \ { \ ... \ }while(0)

瞬间内牛满面……想起大学时阅读linux内核源码过程中,第一次遇到这种用法时觉得很是惊艳。


为什么会出现do{...}while(0)呢?

首先是基本的宏用在if判断语句时会出现问题:

#define SomeMacro(x) \ expr1_doSth_with(x); \ expr2_doSth_with(x); //使用 if(x) SomeMacro(x); else x++; //展开 if(x) expr1_doSth_with(x); expr2_doSth_with(x);; else x++;
再为这个宏添加上一个花括号来包容语句块:

#define SomeMacro(x) \ { \ expr1_doSth_with(x); \ expr2_doSth_with(x); \ } //使用 if(x) SomeMacro(x); else x++; //展开 if(x) { expr1_doSth_with(x); expr2_doSth_with(x); } ; else x++;
这种情况下使用宏就要小心这个分号了。可能有人觉得不要添加那个括号就好了,不过这样看起来很奇怪:

#define SomeMacro(x) \ { \ expr1_doSth_with(x); \ expr2_doSth_with(x); \ } //使用 if(x) SomeMacro(x) else x++;

看到上面的if-else语句,是不是总觉得很别扭呢? :) C++使用者总有个分号结尾瘾……

最后一点看似不重要却也挺重要的作用是:对IDE良好。如果将分号放到宏里面,IDE检查不到行末的分号,会造成缩进错误。这一点其实也可以归于上一句话,C++的开发环境有分号结尾瘾……LOL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值