do {} while(0)有什么用?

Nik*_*s R 3 c c++ python do-while semantics

可能重复:
为什么在C/C++宏中有时会出现无意义的do/while和if/else语句?
当我们定义宏时,do while(0)有什么用?
怎么做{} while(0)在宏中工作?

我想知道它的用途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)
Run Code Online (Sandbox Code Playgroud)

ham*_*ene 5

它使编译器需要,;所以宏看起来像一个函数调用:

Py_DECREF(x); // ok
Py_DECREF(x) // error
Run Code Online (Sandbox Code Playgroud)