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

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

2012-10-21 
linux内核链表list_entry这个宏看不懂!如题!相关代码如下:C/C++ code#define offsetof(t, m)((size_t) (&(

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

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

热点排行