Linuxにおけるcontainer_ofの使い方は次のとおりです
Linuxでは、container_ofは指定されたメンバ変数のポインタを指す構造体のポインタを計算するマクロ関数です。その定義は以下の通りです。
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
container_ofマクロは3つの引数を取ります。
- ptrはクラスのメンバ変数を指すポインタ
- 構造体タイプ。
- メンバー: メンバー変数の名称。
そのメンバー変数が属する構造体のポインタへのポインタを返す。
例えば、以下の構造体定義があるとしましょう
struct person {
char name[20];
int age;
struct list_head list;
};
リストノードである、struct list_head 型の list があります。list を指すポインタ変数 ptr がある場合、container_of を使用して ptr が属する person 構造体のポインタを取得できます。次のようになります。
struct person *p = container_of(ptr, struct person, list);
このようにして、リンクされたリストにおいて、ノードポインタから構造体全体を取得し、対応する操作を実行することができます。これは、特にリンクされたリストやデータ構造を処理する際に、Linuxカーネルでよく使用されます。