看從https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/linux/list.h?id=refs/tags/v3.10-rc2#n418
的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循環,無黑魔法在這裏,你可以使用繼續/中斷。
對於你的其他問題,我想這取決於你爲什麼試圖做到這一點。最簡單的方法是:
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);
感謝您的及時答覆。無論如何,假設語句if(pos == pos.x)在第二個list_for_each_entry中再次成功,我需要重新列表。因此,我認爲我可能不得不使用goto或遞歸函數,不是嗎? – user2403843
在這種情況下,我寧願使用循環。我用一個例子編輯了我的答案 – Guillaume