猿问

了解Linux内核中的container_of宏

当我浏览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);

看起来什么也没做。有人可以在这里填补空白吗?


长风秋雁
浏览 637回答 3
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)并从给定的指针中减去此偏移量。结果是指向结构开始的指针。最后,将此指针转换为结构类型以具有有效变量。
随时随地看视频慕课网APP
我要回答