如何用container_of宏实现类型转换

   2024-09-30 9850
核心提示:container_of 是一个宏,用于在 Linux 内核和其他 C 语言项目中实现类型转换以下是 container_of 宏的定义:#define container_o

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 结构体,包含 idname 两个成员。我们创建了一个 Student 实例,并获取了 id 成员的指针。然后,我们使用 container_of 宏将 int 指针转换为 Student 指针,以便访问整个结构体的成员。

 
举报打赏
 
更多>同类维修大全
推荐图文
推荐维修大全
点击排行

网站首页  |  关于我们  |  联系方式网站留言    |  赣ICP备2021007278号