#define container_of(ptr, type, member) ({const typeof(((type *)0)->member) * __mptr = (ptr);(type *)((char *)__mptr - offsetof(type, member)); })
时间: 2023-12-02 15:02:38 浏览: 179
这是一个宏定义,用于获取一个结构体成员变量的指针所在的结构体变量的地址。其中,ptr是成员变量的指针,type是结构体类型,member是成员变量的名称。
具体来说,宏定义先定义了一个指向成员变量类型的指针__mptr,然后用offsetof函数获取成员变量在结构体中的偏移量,最后通过指针计算出结构体变量的地址并返回。
这个宏定义在 Linux 内核中被广泛使用,可以方便地获取结构体中嵌套的成员变量的地址,从而进行各种操作。
相关问题
#define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );})中typeof
在这段代码中,typeof 是一个编译器内置的操作符,用于返回表达式的数据类型。在该宏定义中,typeof( ((type *)0)->member ) 用于获取结构体成员变量 member 的数据类型。该表达式是通过将一个指向类型为 type 的空指针强制转换为指向类型为 type 成员变量 member 的指针,然后取该指针所指向的成员变量的数据类型。由于该指针指向的是空指针,因此不会发生内存访问错误。然后,通过 const 修饰符将这个类型指针声明为指向常量的指针,以避免对其进行修改。最终,宏定义会返回一个指向类型为 type 的结构体变量的指针,这个指针指向的结构体变量的成员变量 member 的地址与输入的指针变量 ptr 相对偏移的位置。
container_of
`container_of` 是一个在 Linux 内核中经常使用的宏,用于根据一个结构体中的某个字段获取整个结构体的指针。通常用于实现链表等数据结构。
该宏的定义如下:
```
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
```
其中,`ptr` 是指向结构体中某个字段的指针,`type` 是结构体类型,`member` 是结构体中的成员字段名称。该宏的返回值是指向整个结构体的指针。
举个例子,假设有以下结构体定义:
```
struct student {
char name[20];
int age;
struct list_head list;
};
```
其中,`list` 是一个链表节点结构体,`list_head` 是链表头结构体。如果需要根据链表节点指针获取整个 `student` 结构体的指针,可以使用 `container_of` 宏:
```
struct student *stu;
struct list_head *pos;
list_for_each(pos, &stu_list) {
stu = container_of(pos, struct student, list);
/* 对 stu 进行操作 */
}
```
以上代码中,`pos` 是链表节点指针,`&stu_list` 是链表头指针。通过 `container_of` 宏可以获取整个 `student` 结构体的指针,从而对其进行操作。
阅读全文