linux kernel 内核中常常可以看到container_of 的身影,在这里分析一下,加深印象
首先看定义
作用: 简而言之就是通过结构体成员指针找到指向结构体指针
整个宏定义分为两个部分
第一部分
这句话的意思其实就是 定义一个中间变量__mptr,赋值为ptr,也就是指向成员的指针.
第二部分
首先来看一下offsetof定义
这是一个依赖于编译器的宏,他的意思是 获得结构体成员在结构体内的偏移地址.
这个宏有点巧妙,编译器认为0是一个有效的地址,从而认为0是type指针的起始地址,这样就可以变相取得的成员指针的偏移位置,如下图
明白了offsetof 宏,上面第二部分就比较简单了,实际上就是 成员指针 减去 成员在结构体的偏移位置 获得指向结构体的指针
可能大家看了上面还有很多疑惑,下面举个例子来描述一下就明白了
代码见https://github.com/songbingyu/Linux/blob/master/sample/OffsetTest.c
编译运行结果如下
如果还是没有看明白,请及时联系我哈哈