Chinaunix首页 | 论坛 | 博客
  • 博客访问: 244504
  • 博文数量: 49
  • 博客积分: 2591
  • 博客等级: 少校
  • 技术积分: 515
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-15 00:03
文章分类

全部博文(49)

文章存档

2009年(3)

2008年(46)

我的朋友

分类: LINUX

2008-05-12 18:59:48

宏定义container_of 返回  包含member结构的type结构指针(member的指针为ptr )

这里的原理主要是用 member的指针ptr减去member在type中的偏移值

因为struct的地址是从小往上增长的,指向type的指针在低地址,指向member的指针在高地址

 #define container_of(ptr, type, member) ({                  \
    const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
    (type *)( (char *)__mptr - offsetof(type,member) );})
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
1.ptr为物理地址,其类型和member类型一致,最终使用typeof( ((type *)0)->member )
  由编译器自动返回member的类型
2.type为包含member成员的结构体
3.offsetof(type,member)为member成员在type结构体中的偏移值,大小范围0~sizeof(type)字节
 (因为以0地址为type类型数据结构的起始地址)
4.ptr- offsetof()就等于包含该ptr的type结构体父变量的物理起始地址,强制转换为(type*)

阅读(1319) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~