将宏 container_of 与结构成员一起使用

use of macro container_of with struct member

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

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?

但所有这些链接都使用三个参数,但其中 none 使用结构成员来检索相应的结构。

我担心的是 container_of 宏 return 仅通过传递结构成员就可以对应结构?

程序 运行 在 64 位 ubuntu 14.0.4 内核 3.13.0 和 gcc 4.8.4

上正确

在用于构建专有代码的源代码中的某处还有另一个 container_of 的定义。另一个定义可以是宏或函数,并带有一个参数。我对此无话可说。您应该在 headers 或来源中找到它。

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

在宏的定义中,第一行确定成员的类型,第二行计算结构开始与我们确定 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.