• 使用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宏的定义、原理及在实际编程中的应用。通过使用这个宏,我们可以方便地在已知结构体成员的情况下,获取包含该成员的完整结构体的指针,从而实现更加灵活和高效的数据结构管理和操作。

  • 相关阅读:
    大模型赛道如何实现华丽的弯道超车
    浅谈安科瑞无线测温设备在挪威某项目的应用
    Linux: network: dhcp: mtu 这个里面也有关于网卡的MTU设置;
    在一个流量为王的时代,泰山众筹为什么脱颖而出呢?本文深度解析
    linux 分析网络 内存 cpu 磁盘
    网安强校广州大学,学硕改考408!计院专硕也变难了!
    element table表格行列合并span-method,根据数据动态行列合并
    C语言实现输入 n 个字符串,将它们按字母由小到大的顺序排列并输出
    Nginx配置文件
    presto安装部署教程
  • 原文地址:https://blog.csdn.net/java666668888/article/details/140048661