#define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER)
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
container_of宏是Linux内核中广泛使用的一个宏。这个宏有三个参数:
ptr
:指向结构体内部成员的指针。type
:结构体的类型。member
:结构体内的成员名称。
宏内部首先创建一个临时指针__mptr,类型为指向type结构体中member成员的类型,然后将其初始化为传入的ptr。接着,宏使用offsetof宏计算成员member在其所属结构体type开始处的偏移量,然后从__mptr指针减去这个偏移量,从而得到指向整个结构体type的指针。
作用:从一个结构体的成员指针反推出这个结构体的指针。常用于处理链表、树等数据结构。
示例1,假设有一个结构体,如果我们有一个指向name成员的指针char *pname,想要得到指向整个example结构体的指针。
struct example {
int id;
char name[20];
// 其他成员...
};
struct example *pexample = container_of(pname, struct example, name);
示例2
struct extruder_stepper {
struct stepper_kinematics sk;
double pressure_advance, half_smooth_time, inv_half_smooth_time2;
};
static double extruder_calc_position(struct stepper_kinematics *sk)
{
struct extruder_stepper *es = container_of(sk, struct extruder_stepper, sk);
}