可能的重复:
C/C++ 宏中的 Do-While 和 if-else 语句 https://stackoverflow.com/questions/154136/do-while-and-if-else-statements-in-c-c-macros
do { … } while (0) — 它有什么用? https://stackoverflow.com/questions/257418/do-while-0-what-is-it-good-for
我正在阅读linux内核,发现了很多这样的宏:
#define INIT_LIST_HEAD(ptr) do { \
(ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)
他们为什么使用它而不是简单地在 {} 中定义它?
您可以在其后跟一个分号,使其看起来和行为更像一个函数。
它也可以正确地与 if/else 子句一起使用。
如果没有 while(0),上面的代码将无法使用
if (doit)
INIT_LIST_HEAD(x);
else
displayError(x);
因为宏后面的分号会“吃掉”else 子句,而上面的代码甚至无法编译。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)