The*_*kle 4 c macros loops while-loop
可能重复:
{} while(0)在宏中如何工作?
此博客文章的示例:
#define VTAILQ_INSERT_BEFORE(listelm, elm, field) do { \
(elm)->field.vtqe_prev = (listelm)->field.vtqe_prev; \
VTAILQ_NEXT((elm), field) = (listelm); \
*(listelm)->field.vtqe_prev = (elm); \
(listelm)->field.vtqe_prev = &VTAILQ_NEXT((elm), field); \
} while (0)
Run Code Online (Sandbox Code Playgroud)
我遇到过其他人,但这个突出了我的意思
长话短说:
如果在unbraced if else语句中使用非循环宏,则会被搞砸.
if (a)
VTAILQ_INSERT_BEFORE(c, d, e);
else
blah(b);
Run Code Online (Sandbox Code Playgroud)
在这种情况下会破坏性的.
这里有更详细的答案:
为什么在宏中使用明显无意义的do-while和if-else语句?