117.info
人生若只如初见

container_of宏在嵌入式系统中的使用

container_of 宏是一个常用于 Linux 内核和其他 C 语言编写的嵌入式系统中的实用宏

container_of 宏的主要作用是从一个成员变量的指针,反向获取到包含该成员变量的结构体的指针。这在处理回调函数、链表操作等场景时非常有用。

以下是 container_of 宏的基本用法:

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

这里有一个简单的例子来说明如何在嵌入式系统中使用 container_of 宏:

#include
#include 

typedef struct {
    int id;
    char name[20];
} student_t;

int main() {
    student_t student1 = {1, "Alice"};
    student_t student2 = {2, "Bob"};

    // 获取 student1 的 name 成员的指针
    char *name_ptr = &student1.name;

    // 使用 container_of 宏获取包含 name 成员的 student_t 结构体的指针
    student_t *student_ptr = container_of(name_ptr, student_t, name);

    // 输出结果
    printf("Student ID: %d\n", student_ptr->id);
    printf("Student Name: %s\n", student_ptr->name);

    return 0;
}

在这个例子中,我们首先定义了一个 student_t 结构体,然后创建了两个学生对象 student1student2。接着,我们获取了 student1name 成员的指针,并使用 container_of 宏获取了包含该成员的 student_t 结构体的指针。最后,我们输出了学生的 ID 和名字。

需要注意的是,container_of 宏依赖于 C 语言的特性(如 typeof 运算符和复合语句表达式),因此在使用时需要确保编译器支持这些特性。

未经允许不得转载 » 本文链接:https://www.117.info/ask/feaa7AzsBAQJSBg.html

推荐文章

  • container_of的使用方法是什么

    container_of 是一个 C 语言宏,用于通过结构体成员的指针获取包含该成员的结构体的指针。
    它的使用方法如下:
    #define container_of(ptr, type, memb...

  • 在C语言中如何安全使用container_of

    在C语言中,container_of宏通常用于获取包含特定成员的结构体的指针。使用container_of宏时,需要确保传入的参数是有效的,并且结构体的成员的偏移量是正确的,以...

  • container_of宏与offsetof宏的关系

    container_of宏和offsetof宏是在C语言中用来处理结构体的宏。
    offsetof宏用于获取结构体中特定成员变量的偏移量,其定义如下:
    #define offsetof(TYPE...

  • 为什么说container_of宏很有用

    container_of宏非常有用,因为它提供了一种在数据结构中获取包含该结构的容器结构的简单且有效的方法。通过container_of宏,可以从一个结构体成员的地址获取该结...

  • 用startactivityforresult实现多Activity交互

    startActivityForResult 是 Android 中一种常用的 Activity 之间通信方式,它允许你从一个 Activity 启动另一个 Activity,并在第二个 Activity 完成操作后返回结...

  • startactivityforresult与Activity生命周期的关系

    startActivityForResult 是 Android 中用于从一个 Activity 启动另一个 Activity,并在新 Activity 完成后返回结果的方法。这种机制允许您在两个 Activity 之间进...

  • startactivityforresult在不同Android版本中的差异

    startActivityForResult 是一个用于从一个 Activity 启动另一个 Activity,并在操作完成后返回结果的方法 Android 4.0(API 级别 14)及更低版本:
    在这些版...

  • 如何优化startactivityforresult的性能

    startActivityForResult 是 Android 中用于从一个 Activity 启动另一个 Activity,并在结果返回时处理数据的方法。要优化 startActivityForResult 的性能,可以遵...