当我浏览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)
并从给定的指针中减去此偏移量。结果是指向结构开始的指针。最后,将此指针转换为结构类型以具有有效变量。
- 3 回答
- 0 关注
- 636 浏览
添加回答
举报
0/150
提交
取消