簡體   English   中英

請求解釋內核宏:hlist_nulls_for_each_entry

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM