为什么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)
,而不是为一个单独的语句.
所以当你使用它时,你被迫在宏的末尾添加分号.这是一种常见的习语,也是执行它的唯一方法.
如果有人有代码执行此操作:
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语句下).
宏确保宏调用在代码块内.
归档时间: |
|
查看次数: |
12557 次 |
最近记录: |