2011-11-15 15 views
6

container_ofマクロは、一見 "エクストラ" 括弧で囲まれています。その代わりのブロックマクロの周りにカッコが必要なのはなぜですか? Linuxでは

#define container_of(ptr, type, member) ({ \ 
       const typeof(((type *)0)->member) *__mptr = (ptr); 
       (type *)((char *)__mptr - offsetof(type,member));}) 

、私達はちょうど

#define container_of(ptr, type, member) { \ 
       const typeof(((type *)0)->member) *__mptr = (ptr); 
       (type *)((char *)__mptr - offsetof(type,member));} 

を使用することができますか?

かっこは必須か、予防措置のためのものですか?

+0

これはむしろCよりGCCタグ付けされなければならない....... –

答えて

11

必要です。使用される "トリック"の1つは、この「奇妙な」({ code })構文を必要とするGCCのstatement expressionsです。

このマクロを使用するコードは、ほとんどの使用例でコンパイルされず、有効ではありません。

も参照してください: Rationale behind the container_of macro in linux/list.h

そして:container_ofをグレッグ・クロー=ハートマンによる。

+0

はどうもありがとうございました! – SHH

9

({...})は、ブレースされたグループで、式の中で使用できるコードブロックです。最後のステートメントはその値を決定します。

マクロの内部では、マクロを関数と同じように動作させるためにマクロを使用します。 ほとんどの場合、static inlineの機能が望ましいでしょう。

関連質問:

+1

ありがとうございます! – SHH

関連する問題