container_of
是一個宏,用于在 Linux 內核和其他 C 語言項目中實現類型轉換
以下是 container_of
宏的定義:
#define container_of(ptr, type, member) ({ \
const typeof(((type *)0)->member) *__mptr = (ptr); \
(type *)((char *)__mptr - offsetof(type, member)); })
這個宏接受三個參數:
ptr
:指向成員變量的指針。type
:包含成員變量的結構體或聯合體的類型。member
:結構體或聯合體中成員變量的名稱。宏的工作原理如下:
offsetof(type, member)
函數實現的,它返回成員在類型中的字節偏移量。以下是一個使用 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 宏將 int 指針轉換為 Student 指針
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;
}
在這個示例中,我們有一個 Student
結構體,包含 id
和 name
兩個成員。我們創建了一個 Student
實例,并獲取了 id
成員的指針。然后,我們使用 container_of
宏將 int
指針轉換為 Student
指針,以便訪問整個結構體的成員。