Chinaunix首页 | 论坛 | 博客
  • 博客访问: 50520
  • 博文数量: 27
  • 博客积分: 716
  • 博客等级: 上士
  • 技术积分: 285
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-31 11:12
文章分类

全部博文(27)

文章存档

2012年(8)

2011年(19)

我的朋友

分类: LINUX

2011-09-12 11:17:05

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

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

前些天在一个同事那里聊到了零指针,突然又想起了这段代码,所以想拿出来再好好品一品。

这个宏定义就是想要根据结构体中某一个成员的地址来求出结构体的开始地址。


我们知道要求出结构体的开始地址,只需要知道其中一个成员的地址和这个成员与该结构体开始位置

的距离即可。

现在我们已经知道了其中一个成员的地址,那么只需要求出这个成员与该结构体的距离就可以了。

offsetof宏定义就是要求出这个值的。

1、首先来了解以下#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

给零指针强制转换成TYPE类型,那么我们现在就得到了一个指向TYPE类型的指针,值为0。

然后对其中的MEMBER取址&((TYPE *)0)->MEMBER其实就是MEMBER地址与TYPE开始地址的差了,我们

也就得到了这个成员与该结构体开始位置的距离。

2、#define container_of(ptr, type, member)

ptr是member的地址,我们利用typeof定义出一个member类型的指针__mptr,并让其指向member。

最后我们用__mptr减去通过offset得到的距离就是type结构体的开始地址了。

阅读(633) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:程序员的灯下黑:重知识轻技术(转)

给主人留下些什么吧!~~