我对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;});
答案 0 :(得分:3)
这是一个复合语句。最后1
存在,因此语句块的值计算为1,使条件为真。
复合语句中的最后一件事应该是一个后跟分号的表达式;此子表达式的值用作整个构造的值。
这里不论我们想要执行tpos
循环的for
的指定值是什么。这就是为什么1;
存在的原因。循环将在指定的其他条件下停止,即(!is_a_nulls(pos))
。
是的,您可以使用增量操作将其移至 - 由commma运算符分隔。我们也可以格式化循环来做到这一点。但请记住,我们在这里运行循环以获取初始值,因此我们需要在增量完成之前使用它。
请注意 - 这是gcc扩展名。 C标准不提供此功能。这意味着它不是便携式解决方案。如果你用相同的旧for循环块编写它,那么基于可移植性就可以了。