溫馨提示×

如何用container_of宏實現類型轉換

小樊
89
2024-09-02 19:42:57
欄目: 編程語言

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)); })

這個宏接受三個參數:

  1. ptr:指向成員變量的指針。
  2. type:包含成員變量的結構體或聯合體的類型。
  3. member:結構體或聯合體中成員變量的名稱。

宏的工作原理如下:

  1. 首先,它計算出給定成員在其所屬結構體或聯合體中的偏移量。這是通過 offsetof(type, member) 函數實現的,它返回成員在類型中的字節偏移量。
  2. 然后,它將給定的成員指針減去該偏移量,得到結構體或聯合體的起始地址。
  3. 最后,它將計算出的地址強制轉換為目標類型的指針。

以下是一個使用 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 結構體,包含 idname 兩個成員。我們創建了一個 Student 實例,并獲取了 id 成員的指針。然后,我們使用 container_of 宏將 int 指針轉換為 Student 指針,以便訪問整個結構體的成員。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女