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<stdio.h>
#include <stddef.h>
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
結構體,然后創建了兩個學生對象 student1
和 student2
。接著,我們獲取了 student1
的 name
成員的指針,并使用 container_of
宏獲取了包含該成員的 student_t
結構體的指針。最后,我們輸出了學生的 ID 和名字。
需要注意的是,container_of
宏依賴于 C 語言的特性(如 typeof 運算符和復合語句表達式),因此在使用時需要確保編譯器支持這些特性。