【发布时间】:2015-04-30 21:47:54
【问题描述】:
C 中的常见做法是使用:
#define FOO() do { /* body */ } while (0)
虽然这很好,但也可以这样做:
#define FOO() { /* body */ }((void)0)
{...}((void)0) 具有许多相同的好处:您不会意外合并逻辑,并且在行尾需要 ;,所以像这样的奇怪表达式不会被忽视:@ 987654327@.
我注意到的唯一区别在于它意味着您需要在 if 语句中使用大括号。
if (a)
FOO();
else
BAR();
必须写成:
if (a) {
FOO();
} else {
BAR();
}
除了这个怪癖,它似乎运作良好,防止了do/while方法通常用于的相同类型的问题。
这两种方法有什么显着差异吗?
换一种说法,如果您看到使用{...}((void)0) 的代码库,除了已经指出的一个区别之外,是否还有实际的理由切换到使用do{..}while(0)?
【问题讨论】:
-
{ … } (void)0变体从未在实践中使用过——我以前从未见过它建议过,甚至。这很简单奇怪!而且毫无意义。而且没用,因为您不能像do { … } while (0)替代品那样简单地使用它。(void)0演员表给你带来的正是任何有价值的东西——它没有任何好处。 -
实际差异 #1:人们知道并识别
do { ... } while(0)变体,而不是其他变体。 -
你指出的差别很大。
-
@ideasman42:不,接下来的语法不需要分号。见rextester.com/KJLA9675
-
同样的例子在 C:rextester.com/ADOSK79081