【问题标题】:What is the use of do{}while(0)? [duplicate]do{}while(0) 有什么用? [复制]
【发布时间】:2012-03-08 04:27:38
【问题描述】:

可能重复:
Why are there sometimes meaningless do/while and if/else statements in C/C++ macros?
What's the use of do while(0) when we define a macro?
how does do{} while(0) work in macro?

我想知道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)

【问题讨论】:

  • 一般来说,它允许您使用breakcontinue 跳过剩余的代码,而无需使用gotoreturn(完全从函数返回)。在您的示例中,目的非常不同 - 它强制用户使用 ; 跟随宏的使用,而不会引起任何编译器警告。

标签: c++ python c semantics do-while


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2010-09-20
    • 2010-10-29
    • 1970-01-01
    • 2021-08-19
    • 2012-03-18
    • 2016-08-22
    相关资源
    最近更新 更多