参照元†
- ポインタが指す構造体のメンバ、それを含む構造体へのポインタを返す。
- 例えば、
struct example {
int mem_a;
char mem_b;
};
struct example hoge;
- という構造体があったとする。
int *mem_ptr = &hoge.a;
- 上記のような、構造体のメンバへのポインタ mem_ptr しか
分からない状態から hoge へのポインタを得たいときに container_of を
使う。
struct example *ptr = container_of(mem_ptr, struct example, mem_a);
- すると ptr が指す先(hoge.mem_a)を含む構造体への
ポインタ(&hoge)が得られる。
- ptr
- type
- ptr に指定したポインタが指すメンバ、これを含む「構造体名」を指定する。
マクロはここで指定した型のポインタを返す。
- 上記の例で言うと変数名の hoge ではなくて、変数の型の
名前 struct example を指定する。
- member
- ptr に指定したポインタが指す「メンバ名」を指定する。
- 上記の例で言うとポインタ変数 mem_ptr ではなくて、
struct example 構造体のメンバ名である mem_a を指定する。
返り値†
- type *
- 指定した構造体のメンバへのポインタ(ptr に指定する)が指すメンバ
(メンバの名前は member に指定する)、
これを含む構造体(構造体の型は type に指定する)へのポインタを返す。
/**
* container_of - cast a member of a structure out to the containing structure
* @ptr: the pointer to the member.
* @type: the type of the container struct this is embedded in.
* @member: the name of the member within the struct.
*
*/
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
- member の型のポインタ __mptr を宣言し、ptr の値を代入する。
(type *)( (char *)__mptr - offsetof(type,member) );})
- 構造体の先頭へのポインタを計算する。この値がマクロの戻り値となる。
コメント†