当前位置: 技术问答>linux和unix
求解释,container_of()宏
来源: 互联网 发布时间:2017-01-09
本文导语: 本帖最后由 sudolee 于 2011-10-21 15:56:15 编辑 linux内核里面有这个宏, 用于获取包含嵌入结构的结构的入口(一个结构的父亲), 对这个宏的理解迷迷糊糊, 尤其是"(type *)0)->member", 求解释呀!!! 书上说,这个宏能实现的原...
对这个宏的理解迷迷糊糊, 尤其是"(type *)0)->member", 求解释呀!!!
书上说,这个宏能实现的原因是:C语言的结构体在编译的时候,变量的偏移就定下来了!介个,怎么理解的....
#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));})
|
的确是这个作用,我给楼主分解一下算了:
#define container_of(ptr, type, member)
//ptr是某个结构体成员的地址,type是结构体类型,member成员名字。
const typeof( (type *)0->member ) * __mptr = (ptr);
//把地址0开始的内存认为是type结构体类型,->取得member成员,typeof( (type*)0->member )就是获取member的类型,我们一开始只知道member的名字哦! 那么整个式子就是相当于:
Member类型 *__mptr=ptr; ptr我们知道member的地址。
(type *)((char *)__mptr - offsetof(type, member));
//(char*)__mptr-offsetof就是从这个ptr地址偏移到结构体type的头部。
这就是运作过程,最终我们得到的是ptr这个地址上的member成员所在结构体的起始地址。
这个宏一是为了验证是否真的存在这么一个叫做member的成员,这是由__mptr=ptr赋值语句达到的。
另外就是获得结构体的地址,这是第二句达到的。
|
4楼正解,楼主可以节贴。
|
container_of正是取出的成员member的地址
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。