LIST_ENTRY(item, type, member)详解

/*
 * @brief Obtain the pointer to a structure that contains a list.
 * @param item    [IN] Current node's pointer to the next node.
 * @param type    [IN] Structure name.
 * @param member  [IN] Member name of the list in the structure.
 */
#define LIST_ENTRY(item, type, member) \
    ((type *)(void *)((char *)(item) - OFF_SET_OF(type, member))) 

要理解以上宏定义,首先得弄清楚OFF_SET_OF(type, member)

/*
 * @brief Obtain the pointer to a list in a structure
 *
 * @param type    [IN] Structure name.
 * @param member  [IN] Member name of the list in the structure.
 */
#define OFF_SET_OF(type, member) ((size_t)&(((type *)0)->member))

也就是弄清楚  ((size_t)&(((type *)0)->member))  的意思,解释:

1、在0这个地址看做有一个虚拟的type类型的结构体变量,那么取这个结构体变量的成员,再取这个成员的地址,就是这个结构体变量中这个成员的偏移地址(由于结构体变量在地址为0的地方,所以这个成员在这个结构体中的绝对位置也是这个值),注意:实际编译器会自动优化,并不会去取这个成员,而是去取这个成员的地址。

2、所以这句话的意思就是获取一个结构体中一个成员在这个结构体中的偏移地址。

弄清楚了  OFF_SET_OF(type, member)  的意思就不难理解LIST_ENTRY(item, type, member) 了

1、item表示结构体类型type中member成员变量的绝对地址

2、结构体类型type首地址 = 结构体类型type中member成员的绝对地址 - 结构体类型type中member成员相对结构体类型type首地址的相对地址

3、也就是获取结构体类型type首地址的绝对地址

综上所述,list_entry表示在找出item指向的链表节点所在的type类型的结构体首地址,member是type类型结构体成员。

item:表示和member同为相同类型的链表,此处item表示指向链表中的一个节点

type:表示需要寻找的结构体类型。

member:表示type类型的结构体里面的成员。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值