如何确定域在结构中的字节偏移?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) |