使用带有struct成员的宏con​​tainer_of

时间:2015-08-31 11:27:25

标签: c data-structures linux-kernel

我试图理解一些专有代码,其中使用单个参数调用container_of,该参数是返回结构的成员结构。

struct want{
.
.
struct member_used;
};
member_struct *ptr_member_used;
struct want *ret_struct container_of(ptr_member_used);

我检查了以下链接

http://codinghighway.com/2013/08/10/the-magical-container-of-macro-and-its-use-in-the-linux-kernel/

Doubts regarding container_of macro in linux

Understanding container_of macro in the Linux kernel

When do you use container_of macro?

但是所有这些链接都使用了三个参数,但它们都没有使用struct member来检索相应的struct。

我担心的是container_of宏如何通过传递struct member来返回相应的struct?

程序在64位ubuntu 14.0.4上运行正常,内核3.13.0和gcc 4.8.4

2 个答案:

答案 0 :(得分:0)

在用于构建专有代码的源代码中,有container_of的另一个定义。另一个定义可以是宏或函数,并采用一个参数。我无能为力。您应该在标题或来源中找到它。

答案 1 :(得分:0)

container_of宏主要用于从任何成员获取父结构地址。

宏的第1行的定义是确定成员的类型,第二行计算结构的起点,从我们确定​​struct起点的成员开始。

为了清楚理解,请参阅下面的代码,这很简单:

#include <stdio.h>
#include <stddef.h>

// Copied from linux/kernel.h
#define container_of(ptr, type, member) ({                      \
                const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
                (type *)( (char *)__mptr - offsetof(type,member) );})

struct myStruct { int a, b; };

int main()
{
    struct myStruct var = {.a = 0, .b = 0}; 

    int *memberPointer = &var.b;

    printf("Struct addr=%p\n", &var);

    struct myStruct *newSp = container_of(memberPointer, struct myStruct, b); 

    printf("Struct addr new=%p\n", newSp);

    if(newSp == &var)
    {   
        printf("It's equal.\n");
    }   

    return 0;
}

输出:

Struct addr=0x7ffddcfd2b10
Struct addr new=0x7ffddcfd2b10
It's equal.