对宏执行{}while(false)的替代方法

alternative to do {} while(false) for macros

本文关键字:方法 false 执行 while      更新时间:2023-10-16

以下是代码:

#define myMacro()   
{               
macro stuff 
} ((void)0)

这不是比do {} while(false)结构更好吗?没有分支,编译时间应该更快——而且所有的东西都有作用域,而且后面需要一个分号——对我来说似乎很完美!

那么有什么缺点吗?或者这真的比do/while好吗?

您的替代构造不适用于if else语句。

void test() {
if (1)
myMacro();
else
myMacro();
}

编译器错误:

error: expected expression
else
^
1 error generated.

也就是说,大多数优化编译器应该识别do { } while(0)模式并对其进行优化。我不确定您正在编译的代码库会比替换这些结构快15倍。

我专门使用do-while-false,这样我就可以从中提取break;

do
{
if (Step1() == false) break;
if (Step2() == false) break;
if (DoMoreWork() == false) break;
} while (0);

不能突破不是循环一部分的块。(fordo-whiledo-whileswitch)。

所以我认为这是你的宏的一个缺点,也是为什么我更喜欢do-while-false