member", 求解....">

当前位置:  技术问答>linux和unix

求解释,container_of()宏

    来源: 互联网  发布时间:2017-01-09

    本文导语:  本帖最后由 sudolee 于 2011-10-21 15:56:15 编辑 linux内核里面有这个宏, 用于获取包含嵌入结构的结构的入口(一个结构的父亲), 对这个宏的理解迷迷糊糊, 尤其是"(type *)0)->member", 求解释呀!!! 书上说,这个宏能实现的原...

本帖最后由 sudolee 于 2011-10-21 15:56:15 编辑
linux内核里面有这个宏, 用于获取包含嵌入结构的结构的入口(一个结构的父亲),
对这个宏的理解迷迷糊糊, 尤其是"(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.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 求解 求解 求解
  • Linux Shell编程从初学到精通 第四章课后习题2 求解
  • 有限元求解器 GetDP
  • 偏微分方程求解工具箱 DUNE
  • linux命令求解释....
  • 偏微分方程求解框架 Overture
  • 100分求解!!!!!
  • 编译内核时候出现的问题,求解
  • makefile求解
  • 求解ucos ii的一句代码
  • 求助linux下mysql 求解!
  • 求解啊,centos下 shutdown -h now 无效?? iis7站长之家
  • 求解windows下硬盘安装linux如何用linux引导
  • 关于linux shell的一个不明白的地方。求解
  • solaris安装不上,求解.............
  • [FreeBSD] 大神,求解,control socket : can‘t to any socket
  • ubuntu12.04求解
  • 100分求解如何查看内存最高使用值!!
  • 高分求解---如何在DOS下查杀欢乐时光病毒?用哪种杀毒软件?Windows98没法进入了!
  • 求解struct的大小


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3