巨集定義函式container of的解釋

2021-08-02 00:08:58 字數 844 閱讀 7858

從kernel裡面摳出的一些與巨集container_of有關的**,如下:

1、此巨集作用是從結構體的某元素(member)出發,得到結構體的首位址;

2、container_of的引數解釋

(3)ptr:指向結構體中member這個元素的指標。

3、offsetof的解釋

(1)格式這樣看比較明顯(->優先順序比&高):#define offsetof(type, member)   (    (size_t)      &( (type *)0 )->member     )

(2)進一步解釋

4、container_of解釋

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

首先獲取結構體元素member的的型別,然後定義乙個指向此型別的指標_mptr,並賦值為ptr;

(2)(type *)  (  (char *)__mptr   -  offsetof(type, member)   )

首先將_mptr強制轉化為char*型別,然後減去偏移量,最後強制轉換為結構體型別指標,即返回了結構體首位址。

這裡之所以轉換為char*型別,是因為減去偏移量時,偏移量是多少,那就減去多少位元組。

巨集定義函式

巨集定義也可以成為 巨集代換 c語言提供的三種預處理功能的其中一種,這三種預處理包括 巨集定義 檔案包含 條件編譯。巨集定義和操作符的區別是 巨集定義是替換,不做計算,也不做表示式求解。c語言編譯工具會在預處理階段,將巨集名替換為字串。所以,我們可以把巨集定義理解為,發生在程式編譯之前的字串替換操作...

C語言巨集定義和巨集定義函式

c語言巨集定義和巨集定義函式 巨集定義可以幫助我們防止出錯,提高 的可移植性和可讀性等。在軟體開發過程中,經常有一些常用或者通用的功能或者 段,這些功能既可以寫成函式,也可以封裝成為巨集定義。那麼究竟是用函式好,還是巨集定義好?這就要求我們對二者進行合理的取捨。我們來看乙個例子,比較兩個數或者表示式...

關於巨集定義函式

擷取部分內容 使用帶引數的巨集定義可完成函式呼叫的功能,又能減少 系統開銷,提高執行效率。正如c語言中所講,函式的使用可以使程式更加模組化,便於組織,而且可重複利用,但在發生函式呼叫時,需要保留呼叫函式的現場,以便子 函式執行結束後能返回繼續執行,同樣在子函式執行完後要恢復呼叫函式的現場,這都需要一...