關於container of等巨集的整理

2021-06-10 17:35:50 字數 2077 閱讀 2998

一直很是疑惑container_of是什麼意思,最近看了一些資料,整理一下。

1)typeof

首先,我們要知道typeof,它是gcc的c語言擴充套件保留字,用於宣告變數型別。typeof的引數可以是兩種形式:表示式型別。例如:

typeof(x)

這裡假設x是乙個函式指標,這樣就可以得到這個函式返回值的型別了。

如果將typeof用於表示式,則該表示式不會執行。只會得到該表示式的型別。以下示例宣告了int型別的var變數,因為表示式foo()是int型別的。由於表示式不會被執行,所以不會呼叫foo函式。

extern int foo();

typeof(foo()) var;

下面是用型別作引數的例子:

typeof(int *) a,b;

等價於:

int *a,*b;

下面是兩個等效宣告,用於宣告int型別的變數a。

typeof(int) a; /*int型別*/

typeof('b') a; /* gcc中這個表示式的型別是int(自動提公升為int),注意typeof(char)和typeof('b')得到的不是一樣的,這個用sizeof可以看出來*/

一般情況下用typeof就可以了,但是如果要於iso c相容的話,最好是用雙下劃線的形式:__typeof__。

typeof和typedef很像,事實上,只要能用typedef的地方就可以用typeof。

把y定義成乙個字元指標陣列:

typeof(typeof(char *))[4] y;

這與下面的定義等價:

char *y[4];

在巨集宣告中使用typeof

typeof構造的主要應用是用在巨集定義中。可以使用typeof關鍵字來引用巨集引數的型別。因此,在沒有將型別名明確指定為巨集實參的情況下,構造帶有所需型別的物件是可能的。

下面是乙個交換兩個變數的值的巨集定義:

#define swap(a,b)

這個巨集可以交換所有基本資料型別的變數(整數,字元,結構等)

原文參考:

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

獲取type型別中成員member的相對偏移量,如果基址為0,那麼位址&((type *)0)->member轉換為size_t後就是此成員的偏移量了。這裡的0作為起始位址用,來計算偏移量,如果用其它數字代替offsetof得到的數值要減去這個數字才是真正的偏移量,所以這裡用0是最佳的選擇。

3)const  typeof( ((type *)0)->member )    *__mptr = (ptr);

定義乙個__mptr指標變數,型別和member的型別一樣

typeof是獲得乙個變數的型別,((type *)0)->member 則是tpye型別中的member 變數,一般type為結構體型別,member 則為其中的變數。

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

(type *)( (char *)__mptr - offsetof(type,member) );意思是__mptr的位址減去member在該struct中的偏移量得到的位址, 再轉換成type型指標. 該指標就是member的入口位址了.

也就是說,container_of是通過ptr獲取到了type成員member的入口位址,然後再獲得type結構的位址。

container_fo舉例:

struct demo_struct ;

struct demo_struct demo;

同時,如果在另乙個地方,獲得了變數demo中的某乙個域成員變數的指標,比如:

type3 *memp = get_member_pointer_from_somewhere();

此時,如果需要獲取指向整個結構體變數的指標,而不僅僅只是其某乙個域成員變數的指標,我們就可以這麼做:

struct demo_struct *demop = container_of(memp, struct demo_struct, member3);

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...