学习container_of

#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*指针是利用了指针加减运算),自然就是结构体第一个成员所在的地址了,也就是结构体变量本身的地址了,因此就可以求得哪个变量包含了该成员。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值