• 使用container_of宏进行类型转换


    使用container_of宏进行类型转换

    大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!在C语言编程中,经常会遇到需要在数据结构中找到结构体成员所在的结构体的情况,这时候就可以使用Linux内核中的container_of宏。本文将详细介绍container_of宏的作用、原理及在实际编程中的应用。

    基本概念

    container_of宏是Linux内核中的一个非常有用的宏,用于在已知结构体成员的情况下,获取包含该成员的完整结构体的指针。它是通过计算结构体成员在结构体中的偏移量来实现的。

    宏定义

    container_of宏的定义如下:

    #define container_of(ptr, type, member) ({                      \
            const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
            (type *)( (char *)__mptr - offsetof(type, member) );})
    

    参数解析

    • ptr: 指向结构体中某个成员的指针。
    • type: 结构体的类型。
    • member: 结构体中的成员名称。

    原理解析

    container_of宏的原理如下:

    1. typeof( ((type *)0)->member ): 通过0指针取得结构体成员的类型。
    2. __mptr: 将ptr转换为member成员的指针。
    3. (char *)__mptr - offsetof(type, member): 计算结构体起始地址和member成员地址的偏移量。
    4. 最终返回整个结构体的指针。

    示例代码

    让我们通过一个示例来展示如何使用container_of宏来进行类型转换。假设我们有一个结构体定义如下:

    #include 
    #include  // 包含 offsetof 宏的头文件
    
    // 假设的结构体定义
    struct student {
        int id;
        char name[20];
        float score;
    };
    
    // 假设的全局变量
    struct student stu = {
        .id = 123,
        .name = "John Doe",
        .score = 85.5
    };
    
    // 假设的回调函数
    void print_student_info(void *ptr) {
        struct student *stu_ptr = container_of(ptr, struct student, score);
        printf("Student ID: %d\n", stu_ptr->id);
        printf("Student Name: %s\n", stu_ptr->name);
        printf("Student Score: %.1f\n", stu_ptr->score);
    }
    
    int main() {
        printf("Printing student info using container_of macro:\n");
        print_student_info(&stu.score);
    
        return 0;
    }
    

    *使用cn.juwatech.包名的Java示例

    虽然container_of宏主要用于C语言中,Java中并没有类似的需求和宏定义机制。因此,在Java代码示例中,我们可以通过cn.juwatech.*包名来展示实际的应用场景,如Java中的包管理和类定义。然而,对于container_of宏这类特定于C语言的技术,Java通常会采用不同的方法来解决相似的问题,例如通过接口、继承和泛型等方式来管理和操作数据结构。

    总结

    本文详细介绍了container_of宏的定义、原理及在实际编程中的应用。通过使用这个宏,我们可以方便地在已知结构体成员的情况下,获取包含该成员的完整结构体的指针,从而实现更加灵活和高效的数据结构管理和操作。

  • 相关阅读:
    【六祎 - Mac】Mac安装Nginx;Mac编译安装Nginx;
    前端秘法基础式终章----欢迎来到JS的世界
    金九银十,如何面试拿下大厂offer?(附大厂面经+面试宝典)
    用灵活的依赖排除策略来规避不必要的依赖关系
    混沌系统在图像加密中的应用(Hopfield混沌神经网络)
    input输入系统
    Selenium教程:自动化浏览器测试工具
    TypeScript(TS)基础内容详细介绍
    图片充满噪点?手把手教你图片降噪处理怎么操作
    【ML】基于机器学习的糖尿病预测(回归问题)
  • 原文地址:https://blog.csdn.net/java666668888/article/details/140048661