linux-5.15/container_of()
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*参照元 [#u2248d71]
#backlinks
*説明 [#mf644141]
-パス: [[linux-5.15/include/linux/kernel.h]]
-ポインタが指す構造体のメンバ、それを含む構造体へのポイン...
--例えば、
struct example {
int mem_a;
char mem_b;
};
struct example hoge;
--このような構造体があったとき、
int *mem_ptr = &hoge.mem_a;
--構造体のメンバへのポインタmem_ptrしか分からない状態から...
struct example *ptr = container_of(mem_ptr, struct examp...
--するとptrが指す先(hoge.mem_a)を含む構造体へのポインタ...
**引数 [#b71627a5]
-ptr
--構造体のメンバへのポインタを指定する。
-type
--ptrに指定したポインタが指すメンバ、これを含む「構造体名...
---上記の例で言うと変数名のhogeではなくて、変数の型の名前...
-member
--ptrに指定したポインタが指す「メンバ名」を指定する。
--typeに指定した型はmemberに指定した名前のメンバを持って...
---上記の例で言うとポインタ変数mem_ptrではなく、struct ex...
**返り値 [#q3834c46]
-type *
--指定した構造体のメンバへのポインタ(ptrに指定する)が指...
--例えばlist_entry(a, struct hogehoge, b) とすれば、struc...
**参考 [#na45adb3]
*実装 [#v092b33c]
/**
* container_of - cast a member of a structure out to th...
* @ptr: the pointer to the member.
* @type: the type of the container struct this is embed...
* @member: the name of the member within the struct.
*
*/
#define container_of(ptr, type, member) ({ \
void *__mptr = (void *)(ptr); \
-ポインタ演算のためvoid *型の__mptrに変換する。
BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->memb...
!__same_type(*(ptr), void), \
"pointer type mismatch in container_of()"); \
-ptrは、typeのmemberのポインタ型か、void *である必要があ...
--[[linux-5.15/BUILD_BUG_ON_MSG()]]
--[[linux-5.15/__same_type()]]
((type *)(__mptr - offsetof(type, member))); })
-構造体の先頭へのポインタを計算する。この値がマクロの戻り...
--memberを指すポインタから、メンバーのオフセットを引く。
メンバーのオフセットは構造体の先頭から、メンバーまでの距...
return -> ---- ----
mem_a |
---- | offset
mem_b ___|
---- <- __mptr
mem_c
----
---offsetofマクロは構造体のメンバー(member)が構造体(ty...
---GCC拡張構文ではなく、stddef.hで定義されているCの標準的...
*コメント [#g88406c7]
終了行:
*参照元 [#u2248d71]
#backlinks
*説明 [#mf644141]
-パス: [[linux-5.15/include/linux/kernel.h]]
-ポインタが指す構造体のメンバ、それを含む構造体へのポイン...
--例えば、
struct example {
int mem_a;
char mem_b;
};
struct example hoge;
--このような構造体があったとき、
int *mem_ptr = &hoge.mem_a;
--構造体のメンバへのポインタmem_ptrしか分からない状態から...
struct example *ptr = container_of(mem_ptr, struct examp...
--するとptrが指す先(hoge.mem_a)を含む構造体へのポインタ...
**引数 [#b71627a5]
-ptr
--構造体のメンバへのポインタを指定する。
-type
--ptrに指定したポインタが指すメンバ、これを含む「構造体名...
---上記の例で言うと変数名のhogeではなくて、変数の型の名前...
-member
--ptrに指定したポインタが指す「メンバ名」を指定する。
--typeに指定した型はmemberに指定した名前のメンバを持って...
---上記の例で言うとポインタ変数mem_ptrではなく、struct ex...
**返り値 [#q3834c46]
-type *
--指定した構造体のメンバへのポインタ(ptrに指定する)が指...
--例えばlist_entry(a, struct hogehoge, b) とすれば、struc...
**参考 [#na45adb3]
*実装 [#v092b33c]
/**
* container_of - cast a member of a structure out to th...
* @ptr: the pointer to the member.
* @type: the type of the container struct this is embed...
* @member: the name of the member within the struct.
*
*/
#define container_of(ptr, type, member) ({ \
void *__mptr = (void *)(ptr); \
-ポインタ演算のためvoid *型の__mptrに変換する。
BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->memb...
!__same_type(*(ptr), void), \
"pointer type mismatch in container_of()"); \
-ptrは、typeのmemberのポインタ型か、void *である必要があ...
--[[linux-5.15/BUILD_BUG_ON_MSG()]]
--[[linux-5.15/__same_type()]]
((type *)(__mptr - offsetof(type, member))); })
-構造体の先頭へのポインタを計算する。この値がマクロの戻り...
--memberを指すポインタから、メンバーのオフセットを引く。
メンバーのオフセットは構造体の先頭から、メンバーまでの距...
return -> ---- ----
mem_a |
---- | offset
mem_b ___|
---- <- __mptr
mem_c
----
---offsetofマクロは構造体のメンバー(member)が構造体(ty...
---GCC拡張構文ではなく、stddef.hで定義されているCの標準的...
*コメント [#g88406c7]
ページ名: