将宏 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.
我试图理解一些专有代码,其中 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.