我试图理解一些专有代码,其中使用单个参数调用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
答案 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.