container_of
是一个宏,用于在 Linux 内核和其他 C 语言项目中实现类型转换
以下是 container_of
宏的定义:
#define container_of(ptr, type, member) ({ \
const typeof(((type *)0)->member) *__mptr = (ptr); \
(type *)((char *)__mptr - offsetof(type, member)); })
这个宏接受三个参数:
ptr
:指向成员变量的指针。type
:包含成员变量的结构体或联合体的类型。member
:结构体或联合体中成员变量的名称。宏的工作原理如下:
offsetof(type, member)
函数实现的,它返回成员在类型中的字节偏移量。以下是一个使用 container_of
宏实现类型转换的示例:
#include<stdio.h>
#include <stddef.h>
typedef struct {
int id;
char name[20];
} Student;
int main() {
Student student = {1, "Alice"};
int *id_ptr = &student.id;
// 使用 container_of 宏将 int 指针转换为 Student 指针
Student *student_ptr = container_of(id_ptr, Student, id);
printf("Student ID: %d\n", student_ptr->id);
printf("Student Name: %s\n", student_ptr->name);
return 0;
}
在这个示例中,我们有一个 Student
结构体,包含 id
和 name
两个成员。我们创建了一个 Student
实例,并获取了 id
成员的指针。然后,我们使用 container_of
宏将 int
指针转换为 Student
指针,以便访问整个结构体的成员。