4. linux 内核宏 - container_of(ptr, type, member)
container_of(ptr, type, member):通过计算member的地址, 获取 ptr 所在的结构体type的首地址。
#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)
说明:
typeof:获取成员类型
const typeof( ((type *)0)->member ) *__mptr = (ptr);
: 将ptr 赋值给 __mptr, 如果
ptr的类型和member指针的类型不一致,这个赋值会有警告,这个是代码严谨性的体现。
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
: 成员member 在结构体TYPE中的相对地址
ptr - offset
: 获取ptr所在的结构体的地址。
附图说明: