首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

linux内核链表list_entry这个宏看不懂!解决方法

2012-12-30 
linux内核链表list_entry这个宏看不懂!如题!相关代码如下:#define offsetof(t, m)((size_t) (&((t *)0)-m

linux内核链表list_entry这个宏看不懂!
如题!
相关代码如下:

#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类型结构体的首地址,作为宏的返回值或被赋值的对象.

热点排行