0

嗨,我是新手,我尝试使用 list_for_each_entry 来遍历列表。它看起来像这样

list_for_each_entry(pos, head, member){
    if (something == pos.x)
    //reset the loop cursor so that it starts iterating all over again
}

如何在不使用 goto 的情况下执行注释部分?还有一件事,在 list_for_each_entry 中使用 break/continue 是否安全,或者是否有任何功能可以实现这一点?

谢谢。

4

1 回答 1

0

看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);
于 2013-05-21T03:09:08.100 回答