首页 > 解决方案 > 为什么 TAILQ_FOREACH_SAFE 实现包含 ((tvar) = TAILQ_NEXT((var), field), 1)?

问题描述

在使用 queue.h MACRO 进行安全遍历时,我有疑问

#define TAILQ_FOREACH_SAFE(var, head, field, tvar)       \
    for ((var) = TAILQ_FIRST((head));                    \
        (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \
        (var) = (tvar))

为什么在((tvar) = TAILQ_NEXT((var), field), 1)语句中添加tailing 1?

标签: cdata-structuresqueue

解决方案


((tvar) = TAILQ_NEXT((var), field), 1);

这使用逗号运算符。对逗号左侧的表达式求值并丢弃其结果,然后对右侧的表达式求值并返回其结果——在这种情况下为文字 1,因此如果为真,则无论var怎样,整个表达式都为真(var) && ((tvar) = TAILQ_NEXT((var), field), 1)什么tvar被设置为,所以for它是循环的一部分继续。它在不正确时停止var(通过作为NULL指针)。


推荐阅读