#define container_of(ptr, type, member) ({
\
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
首先介绍下container_of的作用:
如果已经知道 xxx 中任何一个成员的地址信息,比如说是 yyy,则利用 container_of 宏可以方便的得到 xxx 的地址信息。
struct A {
char c;
unsigned int u;
...
struct B yyy; <-offset->
int m;
....
}xxx;
1、定义一个指针 __mptr
const typeof( ((type *)0)->member ) *__mptr = (ptr);
typeof 用来声明变量的类型。可见指针 __mptr 为 type 结构体成员 member 的地址类型,const 表示 __mptr 指向的地址中的内容不可改变。并将其初始化为已知成员 yyy 的地址ptr。
2、(type *)( (char *)__mptr - offsetof(type,member) );
已知 yyy 的地址,想要计算出 xxx 的地址,只需用 yyy 的地址减去 offset 即可,其中 offset 为 struct B 相对与 struct A 的地址偏移。
3、因此,需要计算出 offset
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
如果 xxx 的地址为0,那么 yyy 的地址就是两者之间的偏移量。
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
首先介绍下container_of的作用:
如果已经知道 xxx 中任何一个成员的地址信息,比如说是 yyy,则利用 container_of 宏可以方便的得到 xxx 的地址信息。
struct A {
char c;
unsigned int u;
...
struct B yyy; <-offset->
int m;
....
}xxx;
1、定义一个指针 __mptr
const typeof( ((type *)0)->member ) *__mptr = (ptr);
typeof 用来声明变量的类型。可见指针 __mptr 为 type 结构体成员 member 的地址类型,const 表示 __mptr 指向的地址中的内容不可改变。并将其初始化为已知成员 yyy 的地址ptr。
2、(type *)( (char *)__mptr - offsetof(type,member) );
已知 yyy 的地址,想要计算出 xxx 的地址,只需用 yyy 的地址减去 offset 即可,其中 offset 为 struct B 相对与 struct A 的地址偏移。
3、因此,需要计算出 offset
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
如果 xxx 的地址为0,那么 yyy 的地址就是两者之间的偏移量。