相关疑难解决方法(0)

当我们定义宏时,do while(0)有什么用?

可能重复:
C/C++宏中的Do-while和if-else语句

我正在阅读linux内核,我发现了很多像这样的宏:

#define INIT_LIST_HEAD(ptr) do { \
    (ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)
Run Code Online (Sandbox Code Playgroud)

为什么他们使用这个而不是简单地在{}中定义它?

c macros linux-kernel

125
推荐指数
2
解决办法
5万
查看次数

为什么`做{...; 出口(...); 在C中的while(0)`

作为C新手,我无法理解以下代码:

#define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \
                           } while (0)
Run Code Online (Sandbox Code Playgroud)

我收集到这个函数的原因#define是覆盖现有函数,但是do ... while(0)带有无条件 exit()语句的循环有什么意义呢?如果没有循环结构,是不是可以写这个?

c function while-loop c-preprocessor

5
推荐指数
2
解决办法
709
查看次数

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

可能重复:
{} 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)

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

c macros loops while-loop

4
推荐指数
1
解决办法
129
查看次数

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

可能重复:
为什么在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)

c c++ python do-while semantics

3
推荐指数
1
解决办法
302
查看次数