如题!
相关代码如下:
#define offsetof(t, m) ((size_t) (&((t *)0)->m))
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
#define list_entry(ptr, type, member) \
container_of(ptr, type, member)
代码就那样,我看不是很懂啊,求前辈指点一二,小弟感激不尽!在线等啊!!
------解决方案--------------------
1. #define offsetof(t, m) ((size_t) (&((t *)0)->m))
计算成员变量m到结构体t首地址的偏移量,强制结构体t首地址为0,则&((t *)0)->m)就是成员m的地址,也就是偏移量.
2. #define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
const typeof( ((type *)0)->member ) *__mptr = (ptr);
typeof() //取变量的数据类型.
typeof(((type *)0)->member) //将0强制转换成type类型结构体指针,并指向其成员变量member, 获取type结构体中成员变量member的数据类型(如int、short).
const typeof( ((type *)0)->member ) *__mptr = (ptr);
以member的数据类型定义一个指针变量__mptr,并赋值为ptr(t类型的结构体首地址);
(type *)( (char *)__mptr - offsetof(type,member) );
__mptr(member)的地址减去该变量相对于结构体type首地址的偏移量,也就是type类型结构体的首地址,作为宏的返回值或被赋值的对象.