请求解释内核宏:hlist_nulls_for_each_entry

时间:2018-02-10 06:29:43

标签: c linux linux-kernel kernel-module hlist

我对Linux内核函数定义感到困惑。 hlist_nulls_for_each_entry被定义为for循环,并且很容易理解最多的信息。

#define hlist_nulls_for_each_entry(tpos, pos, head, member)            \
    for (pos = (head)->first;                          \
         (!is_a_nulls(pos)) &&                         \
        ({ tpos = hlist_nulls_entry(pos, typeof(*tpos), member); 1;}); \
         pos = pos->next)

虽然我无法理解以下句子,但为什么作者添加; 1; 到最后。为什么不将句子 tpos = hlist_nulls_entry(pos,typeof(* tpos),member)移到 pos = pos-> next 的后面。

 ({ tpos = hlist_nulls_entry(pos, typeof(*tpos), member); 1;});

1 个答案:

答案 0 :(得分:3)

这是一个复合语句。最后1存在,因此语句块的值计算为1,使条件为真。

来自documentation

  

复合语句中的最后一件事应该是一个后跟分号的表达式;此子表达式的值用作整个构造的值。

这里不论我们想要执行tpos循环的for的指定值是什么。这就是为什么1;存在的原因。循环将在指定的其他条件下停止,即(!is_a_nulls(pos))

是的,您可以使用增量操作将其移至 - 由commma运算符分隔。我们也可以格式化循环来做到这一点。但请记住,我们在这里运行循环以获取初始值,因此我们需要在增量完成之前使用它。

请注意 - 这是gcc扩展名。 C标准不提供此功能。这意味着它不是便携式解决方案。如果你用相同的旧for循环块编写它,那么基于可移植性就可以了。