您好,我是新手,我尝试使用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是否安全,或者是否有任何可用的功能来实现这一目标?
感谢。
答案 0 :(得分: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))
如你所见,这被定义为一个简单的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);