container_of函數是一個宏定義,用于從一個結構體的成員指針獲取到該結構體的指針。它的定義如下:
#define container_of(ptr, type, member) ({ \
const typeof(((type *)0)->member) *__mptr = (ptr); \
(type *)((char *)__mptr - offsetof(type, member)); })
使用container_of函數的步驟如下:
首先,你需要有一個結構體類型,該結構體有一個成員指針。
然后,你需要有一個指向該成員的指針。
最后,使用container_of宏將成員指針轉換為結構體指針。
下面是一個示例代碼:
#include <stdio.h>
#include <stddef.h>
struct my_struct {
int data;
char name[20];
};
int main() {
struct my_struct obj;
int *data_ptr = &obj.data;
struct my_struct *ptr = container_of(data_ptr, struct my_struct, data);
ptr->data = 42;
printf("Data: %d\n", obj.data);
return 0;
}
在上面的示例中,我們定義了一個名為my_struct的結構體,其中包含一個整型成員data。然后我們創建了一個指向data成員的指針data_ptr。接下來,我們使用container_of宏將data_ptr轉換為my_struct結構體的指針ptr,并將data成員設置為42。最后,我們打印出obj.data的值,應該輸出42。
注意:container_of宏使用了typeof和offsetof兩個C語言的擴展,所以需要確保你的編譯器支持這些擴展。