可能重复:
Why are there sometimes meaningless do/while and if/else statements in C/C++ macros?
What's the use of do while(0) when we define a macro?
之间有区别吗?
#define MACRO(x) \
{ \
... \
}
和
#define MACRO(x) \
do { \
... \
} while(0)
答案 0 :(得分:1)
嗯,第二种感觉更自然,因为它在使用后总是需要分号。
答案 1 :(得分:1)
do {...} while(0)允许在条件代码中使用宏。
以前问过这个问题:C multi-line macro: do/while(0) vs scope block
Here's another link有几个理由这样做,以及为什么要在最后省略分号。
答案 2 :(得分:0)
编辑重新编辑
在文学中我总是记得形式do {..} while(0)
(有时甚至用;,但这种形式被证明是错误的)。由于宏是字面替换,很容易想象允许{ }
但do { } while(0)
不允许,或者当您需要MACRO表现得像“语句”时会有区别({ };
不要,而do { } while(0);
会这样做;例如if / else(if):
if (COND)
{ // MACRO(..);
...
};
else
{ // this is an else without if
}
,而
if (COND)
do { // MACRO(..);
...
} while(0);
else
{
// this work properly
}
所以第一个有一个void语句,语法上不可能将else连接到它的if,而第二个形式是正确的(如果宏有最后的那个;我记得已经看到某个地方,同样的错误第一种形式出现)