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 则是一个高级宏,用于从结构体成员指针获取整个结构体的指针。其他相关的宏可能有更复杂的实现方式或者支持更多的数据类型。