当前位置:   article > 正文

使用container_of宏进行类型转换

使用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) );})
  • 1
  • 2
  • 3

参数解析

  • 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 <stdio.h>
#include <stddef.h> // 包含 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

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

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

总结

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/769480
推荐阅读
  

闽ICP备14008679号