作用
宏 list_entrycontainer_of 用来通过结构体的成员指针来返回整个结构体的地址。
- 第一个参数:ptr 是结构体中某个成员的地址
- 第二个参数:type 是结构体类型
- 第三个参数:member 是该结构体中成员的名字
原型
#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)
解析
预备知识,需要解析这个宏我们需要有以下预备知识:
首先来分析 offsetof 宏。它的作用是用于计算 TYPE 结构体中成员 MEMBER 的偏移量。
测试程序如下:
#include <stdio.h>
#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,memb