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

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)

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

Bre*_*ain 7

长话短说:

如果在unbraced if else语句中使用非循环宏,则会被搞砸.

if (a)
    VTAILQ_INSERT_BEFORE(c, d, e);
else
    blah(b);
Run Code Online (Sandbox Code Playgroud)

在这种情况下会破坏性的.

这里有更详细的答案:

为什么在宏中使用明显无意义的do-while和if-else语句?