当前位置: 代码迷 >> 驱动开发 >> linux内核链表list_entry这个宏看不懂!解决方法
  详细解决方案

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

热度:94   发布时间:2016-04-28 10:36:47.0
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类型结构体的首地址,作为宏的返回值或被赋值的对象.
  相关解决方案