Chinaunix首页 | 论坛 | 博客
  • 博客访问: 607043
  • 博文数量: 353
  • 博客积分: 1104
  • 博客等级: 少尉
  • 技术积分: 1457
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-23 23:02
个人简介

1、刚工作时做Linux 流控;后来做安全操作系统;再后来做操作系统加固;现在做TCP 加速。唉!没离开过类Unix!!!但是水平有限。。

文章存档

2015年(80)

2013年(4)

2012年(90)

2011年(177)

2010年(1)

2009年(1)

分类:

2011-12-08 13:16:29

如何确定域在结构中的字节偏移?
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
阅读(321) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~