container_of宏的作用及使用场景
时间: 2023-06-20 08:09:40 浏览: 104
`container_of` 是 Linux 内核中一个非常常用的宏,它的作用是根据一个结构体中的成员变量指针获取整个结构体的地址。
在 Linux 内核中,有很多数据结构都是通过嵌套结构体来实现的。例如链表节点可以通过嵌套包含一个 `struct list_head` 结构体来实现,而这个结构体中包含了指向前后节点的指针。当我们需要从链表节点中获取整个结构体的地址时,就可以使用 `container_of` 宏。
`container_of` 宏的定义如下:
```c
#define container_of(ptr, type, member) \
({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) ); \
})
```
其中,`ptr` 是一个指向结构体中某个成员变量的指针,`type` 是结构体的类型,`member` 是结构体中的成员变量名。
使用 `container_of` 宏可以让代码更加简洁和易读。以下是一个使用 `container_of` 宏的例子:
```c
struct my_struct {
int x;
int y;
struct list_head list;
};
struct my_struct *p = container_of(list_node, struct my_struct, list);
```
这段代码中,`list_node` 是指向 `struct list_head` 结构体的指针,我们可以通过 `container_of` 宏获取到 `struct my_struct` 结构体的地址,从而对整个结构体进行操作。
阅读全文