来自this博文的示例:
#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)
我遇到过其他人,但这个突出了我的意思
答案 0 :(得分:7)
长话短说:
如果在unbraced if else语句中使用非循环宏,则会搞砸。
if (a)
VTAILQ_INSERT_BEFORE(c, d, e);
else
blah(b);
在这种情况下会非常突破。
这里有更详细的答案:
Why use apparently meaningless do-while and if-else statements in macros?