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所在的结构体的地址。

附图说明

posted @ 2020-03-23 15:56  standardzero  阅读(303)  评论(0编辑  收藏  举报