以下是代码:
#define myMacro() \
{ \
macro stuff \
} ((void)0)
这不比do {} while(false)
构造更好吗?没有分支,编译时间应该更快 - 而且一切都是作用域的,它后面需要一个分号 - 对我来说似乎很完美!
有没有任何缺点,或者这是否真的优于do / while?
答案 0 :(得分:7)
您的替代构造不适用于if else
语句。
void test() {
if (1)
myMacro();
else
myMacro();
}
编译错误:
error: expected expression
else
^
1 error generated.
话虽如此,大多数优化编译器应该识别do { } while(0)
模式并对其进行优化。我不确定您编译的代码库是否会因替换这些构造而加速15倍。
答案 1 :(得分:0)
我专门使用do-while-false
,以便break;
可以使用do
{
if (Step1() == false) break;
if (Step2() == false) break;
if (DoMoreWork() == false) break;
} while (0);
:
for
您 无法 突破不属于循环的块。 (do-while
,do-while
,switch
,do-while-false
)。
所以我认为你的宏有一个缺点,为什么我更喜欢 OR
。