Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5761884
  • 博文数量: 675
  • 博客积分: 20301
  • 博客等级: 上将
  • 技术积分: 7671
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-31 16:15
文章分类

全部博文(675)

文章存档

2012年(1)

2011年(20)

2010年(14)

2009年(63)

2008年(118)

2007年(141)

2006年(318)

分类: C/C++

2007-09-15 16:00:57

如何确定域在结构中的字节偏移?
ANSI C 在 中定义了offsetof() 宏, 用offsetof(struct s, f) 可以计
算出域f 在结构s 中的偏移量。如果出于某种原因, 你需要自己实现这个功能, 可
以使用下边这样的代码:
#define offsetof(type, f) ((size_t) \
((char *)&((type *)0)->f - (char *)(type *)0))
这里首先把0地址转换成结构体。因此这种实现不是100% 的可移植; 某些编译器可能会合法地拒绝接受。

内核中的container_of宏:
container_of宏,它的功能是得到包含某个结构成员的结构的指针:

其实现如下:

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#define container_of(ptr, type, member) ({                      \
        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
        (type *)( (char *)__mptr - offsetof(type,member) );})

    分析可知__mptr指向的是一个type结构里typeof(((type *)0)->member)类型member成员的指针,offsetof(type,member)是这个成员在结构中的偏移,单位是字节,所以 为了计算type结构的起始地址,__mptr减去它自己的偏移。


http://trulyliu.spaces.live.com/blog/cns!E8E1C6C3419098C5!467.entry
阅读(2208) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~