container_of的实现 - HeavyYuan/A-CD-Record-Management-System GitHub Wiki
container_of的实现:
container_of用于在知道结构体内部元素的情况下,求得结构体本身的地址。
已知:
1)结构体的类型
2)成员member的变量名
3)成员member的指针
求解:
结构体地址
tricks: 地址0的运用和类型强制转换
具体实现:
#define offsetof(type, member) (size_t)&(((type *)0)→member)
#define container_of(ptr, type, member) ({\
const (typeof((type *)0→member))_mptr = ptr; \ 对ptr做类型检查
(type *)((char *)_mptr – offsetof(ptr,member));} ) 指针运算,注意是char *类型地址减去偏移数值
offsetoff是:type类型的的结构体中,元素member的偏移位置
结构体一般用其首个元素来引用,这里巧妙用到了0地址,将其强制类型转换成type指针,
然后得到它的member成员的地址,再将其强制转换成size_t类型(具体数值)