4

Linux 内で次のコードを見つけました (include/linux/list.h)。713行目で迷っています。特に({ n = pos->member.next; 1; })がわかりません。

中括弧は何をしていますか? このステートメントに「1」があるのはなぜですか?

誰かがこの特定の行を説明できれば、それは大歓迎です。リンクリストや #defines がどのように機能するかなどの説明は必要ないことに注意してください。

704 /**
705  * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry
706  * @pos:        the type * to use as a loop cursor.
707  * @n:          another &struct hlist_node to use as temporary storage
708  * @head:       the head for your list.
709  * @member:     the name of the hlist_node within the struct.
710  */
711 #define hlist_for_each_entry_safe(pos, n, head, member)                 \
712         for (pos = hlist_entry_safe((head)->first, typeof(*pos), member);\
713              pos && ({ n = pos->member.next; 1; });                     \
714              pos = hlist_entry_safe(n, typeof(*pos), member))
715 
4

2 に答える 2

6

これはステートメント式です。これはgcc 拡張であり、ドキュメント6.1 Statements and Declarations in Expressionsによると:

複合ステートメントの最後の部分は、式の後にセミコロンを付ける必要があります。この部分式の値は、構造全体の値として機能します。

この場合、コードの場合:

({ n = pos->member.next; 1; })

値は になります1。ドキュメントによると:

この機能は、マクロ定義を「安全」にする (各オペランドを 1 回だけ評価する) 場合に特に役立ちます。

ステートメント式を使用せずにこの例を示します。

#define max(a,b) ((a) > (b) ? (a) : (b))

オペランドの型を知っているという注意点がありますが、この安全なバージョンとは異なります。

#define maxint(a,b) \
   ({int _a = (a), _b = (b); _a > _b ? _a : _b; })

これは、Linux カーネルで使用される多くの gcc 拡張機能の 1 つです。

于 2013-06-10T00:04:56.100 に答える
1

これはステートメント式として知られる GNU 言語拡張です。標準 C ではありません。

于 2013-06-09T23:59:13.160 に答える