Bootstrap

container_of(ptr, type, member)

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

#define container_of(ptr, type, member) ({
const typeof( ((type *)0)->member ) *__mptr = (ptr);
(type *)( (char *)__mptr - offsetof(type,member) );})

这两个宏定义是为了找到结构体的入口地址。参数TYPE就是输入进来的结构体,member就是结构体中的指针变量。

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
假想TYPE这个结构的地址是0, 那么member这个成员的地址就相当于struct头地址的偏移量。

const typeof( ((type *)0)->member ) *__mptr = (ptr);
如果将typeof用于表达式,则该表达式不会执行。只会得到该表达式的类型。所以这句话就是声明一个与member同一个类型的指针常量 *__mptr,并初始化为ptr.

这样(type *)( (char *)__mptr - offsetof(type,member) );})就得到了结构体入口的地址。

;