container of 巧妙的巨集定義

2021-06-02 05:32:10 字數 982 閱讀 6634

// include/linux/kernel.h

#define container_of(ptr, type, member) ()

// include/linux/stddef.h

#define offsetof(type, member) ((size_t) &((tpye *)0)->member)

container_of() 中,第乙個引數ptr是結構體中某乙個成員的指標;第二個引數type是這個結構體的型別;第三個引數member是這個成員的名字。另外,typeof() 是編譯器提供的乙個功能,可以得到某乙個變數的資料型別,如:

int a;

typeof(a) b;   // 這裡的typeof(a) b; 就相當於int b;

b = 10;

在 container_of 和 offsetof 中,都有乙個比較巧妙的設計:(type *)0。我們可以這樣理解,將位址為0的乙個指標定義為type型別(type一般為結構體),那麼type加上某乙個偏移量就可以得到type中某乙個成員的位址,而這個偏移量就是排這個成員之前的所有成員變數所佔的空間大小。如:

struct test ;

那麼,n的位址就可以看作是0x0,id的位址可以看作是0x0 + 0x8。

#include #include #define offsetof(type, member) ((size_t) &((type *)0)->member)

#define container_of(ptr, type, member) ()

struct testtype ;

int main()

執行結果:

name: test

id: 100

name: test

id: 100

container of巨集定義

1 container of在linux核心中是乙個常用的巨集,用於從包含在某個結構中的指標獲得結構本身的指標,通俗地講就是通過結構體變數中某個成員的首位址進而獲得整個結構體變數的首位址。2 介面 container of ptr,type,member ptr 表示結構體中member的位址 ty...

container of巨集詳解

該巨集位於include linux kernel.h 1.定義格式 define container of ptr,type,member 作用 就是根據乙個結構體變數中的乙個域成員變數的指標來獲取指向整個結構體變數的指標。例 struct demo struct struct demo stru...

Linux 核心巨集 container of

container of ptr,type,member arguments ptrthe pointer to the member.代表指標 type the type ofthe container struct this isembedded in.型別 member 成員變數 the na...