2005年09月18日

container_of(マクロ)

初めて見るとかなりビビるマクロ.
例えば,

struct foo {
int x;
struct bar b1;
};

struct foo f1, *f2;
struct bar *b;
b = &f1.b;

なんてあるとき,

f2 = container_of(b, struct foo, b1);

なんてことができてしまう.
もちろん,f2に入ってるのはf1のポインタ.

ちなみに宣言は以下

include/linux/kernel.hより

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

include/linux/stddef.hより

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

ムチャしてるよなーって感じですが,私の場合,hlist(後日解説)をよく使うんで,
かなり御世話になってるです.多謝多謝

それにしても,この宣言って,実は

#define container_of(ptr, type, member) ({ \
(type *)( (char *)(ptr) - offsetof(type,member) );})

でもいい気がする.
実際試してみても,問題なかった.
うーん,

ptr += containter_of(ptr,type,member);

ってのを気にしているのかな?
posted by tak5219 at 08:13| Comment(0) | TrackBack(0) | C言語 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック