看list_for_each_entry的定义
#define list_for_each_entry(pos, head, member) \
for (pos = list_entry((head)->next, typeof(*pos), member); \
&pos->member != (head); \
pos = list_entry(pos->member.next, typeof(*pos), member))
来自https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/linux/list.h?id=refs/tags/v3.10-rc2#n418
如您所见,这被定义为一个简单的 for 循环,这里没有黑魔法,您可以使用 continue/break。
对于你的另一个问题,我想这取决于你为什么要这样做。最简单的方法是:
int iterateAgain = 0;
list_for_each_entry(pos, head, member) {
// (...)
if (something == pos.x) {
iterateAgain = 1;
break;
}
}
if (iterateAgain) {
list_for_each_entry(pos, head, member) {
// (...)
}
}
但根据您的代码,它可能过于冗余等。您也可以有一个递归函数。有很多方法可以做到这一点。
在您发表评论后进行编辑:
int keepIterating;
do {
keepIterating = 0;
list_for_each_entry(pos, head, member) {
// (...)
if (something == pos.x) {
keepIterating = 1;
break;
}
}
} while (keepIterating);