为了账号安全,请及时绑定邮箱和手机立即绑定

了解Linux内核中的container_of宏

了解Linux内核中的container_of宏

长风秋雁 2019-11-26 12:50:53
当我浏览Linux内核时,我发现了一个container_of定义如下的宏:#define container_of(ptr, type, member) ({                      \        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \        (type *)( (char *)__mptr - offsetof(type,member) );})我了解container_of的作用,但我不明白的是最后一句话,即(type *)( (char *)__mptr - offsetof(type,member) );})如果我们按如下方式使用宏:container_of(dev, struct wifi_device, dev);最后一句话的相应部分是:(struct wifi_device *)( (char *)__mptr - offset(struct wifi_device, dev);看起来什么也没做。有人可以在这里填补空白吗?
查看完整描述

3 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

最后一句话:


(type *)(...)

指向给定的指针type。指针计算为相对于给定指针的偏移量dev:


( (char *)__mptr - offsetof(type,member) )

使用cointainer_of宏时,您想要检索包含给定字段的指针的结构。例如:


struct numbers {

    int one;

    int two;

    int three;

} n;


int *ptr = &n.two;

struct numbers *n_ptr;

n_ptr = container_of(ptr, struct numbers, two);

您有一个指向结构中间的指针(并且您知道这是指向已归档的two[ 结构中的字段名称 ] 的指针),但是您想检索整个结构(numbers)。因此,您可以计算two结构中字段的偏移量:


offsetof(type,member)

并从给定的指针中减去此偏移量。结果是指向结构开始的指针。最后,将此指针转换为结构类型以具有有效变量。


查看完整回答
反对 回复 2019-11-26
  • 3 回答
  • 0 关注
  • 636 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信