container_of
宏在 C 語言中通常用于從一個結(jié)構(gòu)體的成員指針獲取到整個結(jié)構(gòu)體的指針
container_of
宏的定義如下:
#define container_of(ptr, type, member) \
((type *)((char *)(ptr) - offsetof(type, member)))
這里,ptr
是指向結(jié)構(gòu)體成員的指針,type
是結(jié)構(gòu)體類型,member
是結(jié)構(gòu)體中成員的名稱。offsetof
函數(shù)用于計算成員在結(jié)構(gòu)體中的偏移量。
以下是一個使用 container_of
宏的示例:
#include<stdio.h>
#include <stddef.h>
typedef struct {
int id;
char name[20];
} Student;
int main() {
Student student = {1, "Alice"};
int *id_ptr = &student.id;
// 使用 container_of 宏獲取 Student 結(jié)構(gòu)體的指針
Student *student_ptr = container_of(id_ptr, Student, id);
printf("Student ID: %d\n", student_ptr->id);
printf("Student Name: %s\n", student_ptr->name);
return 0;
}
在這個示例中,我們首先創(chuàng)建了一個 Student
結(jié)構(gòu)體變量 student
,然后獲取了它的 id
成員的指針 id_ptr
。接著,我們使用 container_of
宏從 id_ptr
獲取到整個 Student
結(jié)構(gòu)體的指針 student_ptr
。最后,我們可以通過 student_ptr
訪問結(jié)構(gòu)體的其他成員。