Linux内核container_of 宏

 linux kernel 内核中常常可以看到container_of 的身影,在这里分析一下,加深印象

 首先看定义

  

  作用: 简而言之就是通过结构体成员指针找到指向结构体指针

  整个宏定义分为两个部分

    第一部分

    

    这句话的意思其实就是 定义一个中间变量__mptr,赋值为ptr,也就是指向成员的指针.

    第二部分

    

    首先来看一下offsetof定义

    

    这是一个依赖于编译器的宏,他的意思是 获得结构体成员在结构体内的偏移地址.

    这个宏有点巧妙,编译器认为0是一个有效的地址,从而认为0是type指针的起始地址,这样就可以变相取得的成员指针的偏移位置,如下图

    

    明白了offsetof 宏,上面第二部分就比较简单了,实际上就是 成员指针 减去 成员在结构体的偏移位置 获得指向结构体的指针

    可能大家看了上面还有很多疑惑,下面举个例子来描述一下就明白了

    

    代码见https://github.com/songbingyu/Linux/blob/master/sample/OffsetTest.c

    编译运行结果如下

    

   如果还是没有看明白,请及时联系我哈哈

  

posted @ 2014-04-24 10:50  songbingyu  阅读(185)  评论(0编辑  收藏  举报