是定義一個__mptr指針變量,類型和member的類型一樣,typeof是獲得一個變量的類型,((type *)0)->member 則是tpye類型中的member 變量,一般type爲結構體類型,member 則爲其中的變量,這裏的0只是作爲一個臨時的指針地址用,任何可以表示地址的數字都可以代替0。
2. #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
獲取TYPE類型中成員MEMBER的相對偏移量,如果基址爲0,那麼地址&((TYPE *)0)->MEMBER轉換爲size_t後就是此成員的偏移量了這裏的0作爲起始地址用,來計算偏移量,如果用其它數字代替offsetof得到的數值要減去這個數字纔是真正的偏移量,所以這裏用0是最佳的選擇
有了這些,面向對象就很容易實現了,其實const typeof( ((type *)0)->member ) *__mptr = (ptr);就類似於C++中在父類中訪問子類的成員甚至函數,即所謂的繼承和多態,這在內核中很常見。
註明:文章部分內容源自網絡,