container_of宏
#define offset_of(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
TYPE // 结构名
MEMBER // TYPE 结构中的成员
(TYPE *)0 // 告诉编译器有一个指向 TYPE 结构的指针,其值为止0
((TYPE *)0)->MEMBER // 取结构 TYPE 中的 MEMBER 成员
&((TYPE *)0)->MEMBER // 取结构 TYPE 中的 MEMBER 成员的地址
因为基地址为0,所以这时 MEMBER 成员的地址就是 MEMBER 在 TYPE 中的偏移
最后再把结果强制转换为size_t型
作用: 返回结构 TYPE 中的成员 MEMBER 的偏移地址
offsetof宏定义在[include/linux/stddef.h]中
#define container_of(ptr, type, member) ({ /
const typeof( ((type *)0)->member ) *__mptr = (ptr); /
(type *)( (char *)__mptr - offset_of(type,member) );})
container_of宏定义在[include/linux/kernel.h]中
typeof() 是 gcc 的扩展,和 sizeof() 类似 ,以获得 member 成员的数据类型
这里使用的是一个利用编译器技术的小技巧,即先求得结构成员在与结构中的偏移量,然后根据成员变量的地址反过来得出属主结构变量的地址。
typeof( ((type *)0)->member ) // 获得 member 成员的数据类型
const typeof( ((type *)0)->member ) *__mptr // 声明一个const 指针
#define offset_of(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
TYPE // 结构名
MEMBER // TYPE 结构中的成员
(TYPE *)0 // 告诉编译器有一个指向 TYPE 结构的指针,其值为止0
((TYPE *)0)->MEMBER // 取结构 TYPE 中的 MEMBER 成员
&((TYPE *)0)->MEMBER // 取结构 TYPE 中的 MEMBER 成员的地址
因为基地址为0,所以这时 MEMBER 成员的地址就是 MEMBER 在 TYPE 中的偏移
最后再把结果强制转换为size_t型
作用: 返回结构 TYPE 中的成员 MEMBER 的偏移地址
offsetof宏定义在[include/linux/stddef.h]中
#define container_of(ptr, type, member) ({ /
const typeof( ((type *)0)->member ) *__mptr = (ptr); /
(type *)( (char *)__mptr - offset_of(type,member) );})
container_of宏定义在[include/linux/kernel.h]中
typeof() 是 gcc 的扩展,和 sizeof() 类似 ,以获得 member 成员的数据类型
这里使用的是一个利用编译器技术的小技巧,即先求得结构成员在与结构中的偏移量,然后根据成员变量的地址反过来得出属主结构变量的地址。
typeof( ((type *)0)->member ) // 获得 member 成员的数据类型
const typeof( ((type *)0)->member ) *__mptr // 声明一个const 指针