我正在阅读linux内核,我发现了很多像这样的宏:
#define INIT_LIST_HEAD(ptr) do { \
(ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)
Run Code Online (Sandbox Code Playgroud)
为什么他们使用这个而不是简单地在{}中定义它?
作为C新手,我无法理解以下代码:
#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \
} while (0)
Run Code Online (Sandbox Code Playgroud)
我收集到这个函数的原因#define是覆盖现有函数,但是do ... while(0)带有无条件 exit()语句的循环有什么意义呢?如果没有循环结构,是不是可以写这个?
可能重复:
{} 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/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 ×4
macros ×2
while-loop ×2
c++ ×1
do-while ×1
function ×1
linux-kernel ×1
loops ×1
python ×1
semantics ×1