为什么我一直看到包含(看似)无意义循环的多行宏?

时间:2011-12-21 21:18:55

标签: c loops macros while-loop

  

可能重复:
  how does do{} while(0) work in macro?

来自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)

我遇到过其他人,但这个突出了我的意思

1 个答案:

答案 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?