1、前言 今天在看代碼時,遇到offsetof和container_of兩個宏,覺得很有意思,功能很強大。offsetof是用來判斷結構體中成員的偏移位置,container_of宏用來根據成員的地址來獲取結構體的地址。兩個宏設計的很巧妙,值得學習。linux內核中有着兩個宏的定義,並在鏈表 ...
前言 今天在看代碼時,遇到offsetof和container of兩個宏,覺得很有意思,功能很強大。offsetof是用來判斷結構體中成員的偏移位置,container of宏用來根據成員的地址來獲取結構體的地址。兩個宏設計的很巧妙,值得學習。linux內核中有着兩個宏的定義,並在鏈表結構中得到應用。不得不提一下linux內核中的鏈表,設計的如此之妙,只需要兩個指針就搞定了。后續認真研究一下這 ...
2013-12-13 08:54 0 4246 推薦指數:
1、前言 今天在看代碼時,遇到offsetof和container_of兩個宏,覺得很有意思,功能很強大。offsetof是用來判斷結構體中成員的偏移位置,container_of宏用來根據成員的地址來獲取結構體的地址。兩個宏設計的很巧妙,值得學習。linux內核中有着兩個宏的定義,並在鏈表 ...
最近在學習c語言宏編程,看到了container_of宏,深入學習了一天,做個筆記留念。 1、看一下書上寫的container_of的版本: 2、舉一個實例: 替換后的結果: 如果替換后的結果你還能看懂,說明你是真明白了,呵呵,有沒有興趣自己寫一遍 ...
1、c語言的結構體中,因為字節對齊的問題,導致成員地址並不能根據類型的大小進行計算。例如: 2、offsetof宏的實現如下: 哈哈,復雜吧,解釋一下:由於造成空洞的對齊動作是由編譯器負責完成的,這里有一個欺騙編譯器的指令:((TYPE *)0), 意思是定義一個 ...
View Code (一).分析下宏定義1: #define offset_of(type,member) ((int)&(((type *)0)->member)) (type * )0 :強制把0地址轉化為type *類型 ...
#define container_of(ptr, type, member) 輸入: 結構體一個成員的member地址ptr, 結構體的類型, 結構體一個成員member的名, 輸出: 得到這個結構體變量的地址; 分析: 結構體類型是確定的,結構體成員 相對 結構體定義的起始地址 偏移 ...
1、#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE*)0)->MEMBER) (include/linux/stddef.h) 1.1 功能: 返回結構體TYPE中MEMBER成員相對於結構體首地址的偏移量,以字節為單位 ...
C/C++中宏總結C程序的源代碼中可包括各種編譯指令,這些指令稱為預處理命令。雖然它們實際上不是C語言的一部分,但卻擴展了C程序設計的環境。 ANSI標准定義的C語言預處理程序包括下列命令: #define,#error,#include,#if,#else,#elif ...
,還是在一開始就被一個小小的 offsetof 宏搞暈了。 offsetof 宏 先來看看offsetof宏是 ...