学习container_of

来源:互联网 发布:ztree导出json 编辑:程序博客网 时间:2024/06/08 00:18

#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) );})

       理解这段宏必须先理解在C语音中({})代表什么意思,The GNU C Reference Manual中有这么一段例子:


     ({ int y = function (); int z;         if (y > 0) z = y;        else z = - y;        z; })
       其值为z,即最后一个表达式的值,并且The GNU C Reference Manual中提到了当知道a,b类型的情况下(通过typeof()函数可以知道,这里假设为int)
     #define maxint(a,b) \       ({int _a = (a), _b = (b); _a > _b ? _a : _b; })
      这种定义方式要比
     #define max(a,b) ((a) > (b) ? (a) : (b))
     这种方式要好,因为在 #define max(a,b) ((a) > (b) ? (a) : (b))中,a,b都计算了两次,不清楚的话,假设一下传入的是x++等类型的就知道了。

      好了,解释到这里,最前那段宏定义也自然就明白了,typeof返回的就是其包含的类型,const typeof( ((type *)0)->member ) *__mptr = (ptr); 定义了一个数据结构成员类型的变量指针, (char *)__mptr - offsetof(type,member) 意思就是成员地址值减去成员偏移量(转成char*指针是利用了指针加减运算),自然就是结构体第一个成员所在的地址了,也就是结构体变量本身的地址了,因此就可以求得哪个变量包含了该成员。

0 0