又是宏……do..while(0)的用法

本文探讨了C++中一种特殊的宏定义技巧,通过do...while(0)实现非复合语句,解决了if-else结构中宏调用的问题。并对比了复合语句方式,解释了为何前者的使用更为广泛。
真是的,我用C++还是太少了。这个宏以前明明见过的,但其存在的意义突然就想不起来了。刚才问了下axx大才又“知道”了一次。赶紧记下来。

这样的宏见过么:
#define FOO(x) do {\
some_code_line_1;\
some_code_line_2;\
} while (0)

(注意while(0)后面没有分号)

乍一看这个宏不过就是定义了个包含多个语句的local scope,用do..while(0)包围起来简直多此一举。直接这样不就好了么:
#define FOO(x) {\
some_code_line_1;\
some_code_line_2;\
}


但问题是这两者不等价……

关键问题是前者定义出来的宏是一个非复合语句,而后者是一个复合语句。C/C++里有些语法结构对复合/非复合语句之间的区别是敏感的,例如说:
if ( someCond )
FOO(x);
else
//...

要是FOO(x)展开后是一个复合语句,那么FOO(x)后面的分号“;”就会终结整个if语句,导致else子句孤立而出现编译错误。
所以关键是那个while(0)后面不加分号。如果加了分号的话就没意义了。

如果用复合语句版本的宏,就要记得不写那个分号:
if ( someCond )
FOO(x)
else
//...

但是这样与一般的函数调用风格不统一,所以很多人倾向于使用do..while(0)这个trick来把local scope包起来而不是直接用复合语句({..})。

印象中这类的宏还有一个变种,
#define FOO(x) switch(0) default: ...

还是怎样的。具体是怎么写的忘记了……以后想起来的话一定得记下来 T T
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值