do{}while(0) 的用途是什么?

3
我想知道使用do{ ... } while(0) (...作为其他代码的占位符)的用途是什么,因为据我所知,它与仅使用...完全相同。
您可以在官方的CPython源代码中找到这样的代码。例如,Py_DECREF宏:
#define Py_DECREF(op)                                   \
    do {                                                \
        if (_Py_DEC_REFTOTAL  _Py_REF_DEBUG_COMMA       \
        --((PyObject*)(op))->ob_refcnt != 0)            \
            _Py_CHECK_REFCNT(op)                        \
        else                                            \
        _Py_Dealloc((PyObject *)(op));                  \
    } while (0)

2
通常情况下,它允许您使用breakcontinue跳过剩余的代码,而不使用gotoreturn(完全从函数返回)。在您的示例中,其目的非常不同--它强制用户在使用带有的宏时遵循规则,而不会引起任何编译器警告。 - ildjarn
1个回答

5

它使编译器需要 ;,因此宏看起来像函数调用:

Py_DECREF(x); // ok
Py_DECREF(x) // error

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接