offsetof
是一個 C 的宏,用于計算結構體中成員的偏移量,其定義如下:
#define offsetof(type, member) ((size_t) &((type *)0)->member)
這里的 type
是結構體的類型,member
是結構體中的成員名。offsetof
宏會返回 member
相對于結構體起始地址的偏移量。
其他相關的宏有 container_of
和 offsetof
的變體,它們的作用也是獲取結構體中成員的偏移量。但是它們有以下區別:
container_of
宏通常用于從結構體成員指針獲取整個結構體的指針。它的定義如下:#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type, member) ); })
container_of
宏中包含了對 offsetof
宏的調用,因此可以通過結構體成員指針來獲取整個結構體的指針。
offsetof
的變體有可能是一些特定平臺或編譯器所定義的宏,它們可能會有更復雜的實現方式或者支持更多的數據類型。因此在使用時需要查看具體的文檔或頭文件定義。總的來說,offsetof
是用于計算結構體中成員偏移量的基本宏,而 container_of
則是一個高級宏,用于從結構體成員指針獲取整個結構體的指針。其他相關的宏可能有更復雜的實現方式或者支持更多的數據類型。