list_entry的实现

来源:互联网 发布:华硕fl5600l怎么优化 编辑:程序博客网 时间:2024/06/06 08:56

linux/list.h

#define list_entry(ptr, type, member) \
container_of(ptr, type, member)


#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)


1.先看&((type *)0)->member:
把“0”强制转化为指针类型,则该指针一定指向“0”(数据段基址)。因为指针是“type *”型的,所以可取到以“0”为基地址的一个type型变量member域的地址。那么这个地址也就等于member域到结构体基地址的偏移字节数。

而offsetof宏,就是使用这个原理获得member位于type的偏移量

2.container_of中 使用ptr的地址减去ptr在type中的偏移量,就获得了type的地址,转换为type指针