gpt4 book ai didi

c - 理解 Linux 内核中的 container_of 宏

转载 作者:太空狗 更新时间:2023-10-29 16:16:05 24 4
gpt4 key购买 nike

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

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

最佳答案

您的用法示例 container_of(dev, struct wifi_device, dev); 可能有点误导,因为您在那里混合了两个命名空间。

虽然您示例中的第一个 dev 指的是指针的名称,但第二个 dev 指的是结构成员的名称。

很可能这种混淆引起了所有的头痛。事实上,您引用中的 member 参数是指容器结构中为该成员指定的名称。

以这个容器为例:

struct container {
int some_other_data;
int this_data;
}

还有一个指向 this_data 成员的指针 int *my_ptr 您将使用宏来获取指向 struct container *my_container 的指针使用:

struct container *my_container;
my_container = container_of(my_ptr, struct container, this_data);

考虑到 this_data 到结构开头的偏移量对于获得正确的指针位置至关重要。

实际上,您只需从指针 my_ptr 中减去成员 this_data 的偏移量即可获得正确的位置。

这正是宏最后一行所做的。

关于c - 理解 Linux 内核中的 container_of 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15832301/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com