做(假)模式

siv*_*udh 26 c++ macros

可能重复:
为什么在C/C++宏中有时会出现无意义的do/while和if/else语句?

为什么do while(false)下面的宏中有必要?

#define LOG(message, ...) \
do { \
Lock<MutualExclusion> lock (logMutex); \

 .... a lot of code ...
} while (false)
Run Code Online (Sandbox Code Playgroud)

我不认为它有任何功能目的.我忽略了什么吗?

Giu*_*ano 60

它将块转换为单个语句.例如,如果你只是使用一个块(即包含的代码{}),就会发生奇怪的事情

#define STUFF() \
  { do_something(); do_something_else(); }

if (cond)
    STUFF();
else
    //...
Run Code Online (Sandbox Code Playgroud)

额外的分号打破了语法.的do {} while(false),而不是为一个单独的语句.

你可以在这里找到更多关于这个和其他宏观技巧的信息.

  • +1为好的答案.希望我可以给另一个不是屁股,而其他许多人. (5认同)

gru*_*czy 8

所以当你使用它时,你被迫在宏的末尾添加分号.这是一种常见的习语,也是执行它的唯一方法.

  • @Rafe:这是一个既定的标准做法.人们普遍认为这实际上是一个非常好的理由. (4认同)

Jac*_*cob 7

如果有人有代码执行此操作:

if (something)
    LOG("My log message");
Run Code Online (Sandbox Code Playgroud)

这将扩展到:

if (something)
    Lock<MutualExclusion> lock (logMutex);
    // A bunch of other code
Run Code Online (Sandbox Code Playgroud)

哪个不正确(只有第一行在if语句下).

宏确保宏调用在代码块内.

  • 这只是故事的一半,可以通过花括号来实现.故事的另一半是它不会在其他构造中破坏(如果有'else`子句,如果用作`if`子句中的唯一语句,则普通花括号方法会破坏. (3认同)