container_of宏分析

来源:互联网 发布:js复杂数据类型 编辑:程序博客网 时间:2024/05/21 09:33

container_of宏分析

#define container_of(ptr, type, member)({             /
        const typeof( ((type *)0)->member ) *__mptr = (ptr);    /
        (type *)( (char *)__mptr - offsetof(type,member) );})


Ø  计算member在type中的偏移量

#define offsetof(TYPE, MEMBER) ((size_t)&((TYPE *)0)->MEMBER)

A-------------> TYPE  *ptype,*pmember;

B-------------> ptype = (TYPE*)0;

C-------------> pmember =ptype->MEMBER;

D-------------> MEMBER的地址为:&pmember;

E------------->强制转换为size_t;

由于B中TYPE指针的初始地址为0,则pmember实际为MEMBER成员在TYPE结构中的偏移量。

Ø  计算一个具体结构体中member成员的实际地址

const typeof( ((type *)0)->member )*__mptr = (ptr);  

A-------------> typeof( ((type*)0)->member )获得member成员的类型;

B-------------> 定义一个member成员的类型,并初始化为ptr;

Ø  计算type的地址

 (type *)( (char *)__mptr -offsetof(type,member) );})

A------------->用实际的地址减去偏移量及为type结构体的地址。

原创粉丝点击