可能的重复:
在C/C++宏中使用do-while和if-else语句
do { ... } while (0) - 有什么用处?
我正在阅读Linux内核,发现了许多这样的宏:
#define INIT_LIST_HEAD(ptr) do { \
(ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)
为什么他们使用这个而不是简单地在{}中定义它?
可能的重复:
在C/C++宏中使用do-while和if-else语句
do { ... } while (0) - 有什么用处?
我正在阅读Linux内核,发现了许多这样的宏:
#define INIT_LIST_HEAD(ptr) do { \
(ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)
为什么他们使用这个而不是简单地在{}中定义它?
if (doit)
INIT_LIST_HEAD(x);
else
displayError(x);
由于宏后面的分号会“吞掉” else 子句,而上面的代码甚至无法编译。
它允许你将多个语句组合成一个宏。
假设你做了类似这样的事情:
if (foo)
INIT_LIST_HEAD(bar);
如果宏定义时没有用包含 do { ... } while (0); 的方式,那么上述代码会被展开为什么样子if (foo)
(bar)->next = (bar);
(bar)->prev = (bar);
显然这不是预期的结果,因为只有在 foo 为真时才会执行第一条语句。而无论 foo 是否为真,第二条语句都会被执行。
编辑:更多解释请参见 http://c-faq.com/cpp/multistmt.html 和 http://developer.apple.com/documentation/DeveloperTools/gcc-4.0.1/cpp/Swallowing-the-Semicolon.html#Swallowing-the-Semicolon
(ptr)->next=(ptr)->prev=(ptr)
。 - Jerry Coffindo {stat}while(0)
并且替换成只有stat
,因为它只会发生一次。 - Karim Manaouil