![](/img/trans.png)
[英]Understanding hlist_bl_for_each_entry_rcu macro in Linux Kernel
[英]Ask for explanation of a kernel macro: hlist_nulls_for_each_entry
我對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;});
這是一個復合語句。 最后1
是這樣,語句塊的值計算為1,使條件為真。
從文檔中
復合語句中的最后一件事應該是一個后跟分號的表達式; 此子表達式的值用作整個構造的值。
無論結果是tpos
的指定值,我們都希望執行for
循環。 這就是為什么有1;
那里。 循環將在指定的其他條件下停止,即(!is_a_nulls(pos))
。
是的,您可以通過增量操作將其移動到 - 也可以由commma操作員分隔。 我們也可以格式化循環來做到這一點。 但請記住,這里我們也在運行循環以獲取初始值,因此我們需要在增加完成之前使用它。
請注意 - 這是一個gcc擴展。 C標准不提供此功能。 這意味着它不是便攜式解決方案。 如果你用相同的舊for循環塊編寫它,那么基於可移植性就可以了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.