使用宏offsetof的时候需要包含<stddef.h>这个头文件。
宏offsetof有两个参数,第一个参数是结构体类型,第二个参数是结构体成员,计算的是结构体成员相较于结构体起始位置的偏移量,我们来看一个例子:
在这个例子中,结构体成员c1相较于结构体起始位置偏移量是0,结构体成员a相较于结构体起始位置偏移量是4,结构体成员c2相较于结构体起始位置偏移量是8,。
那么如何自己模拟实现offsetof这个宏呢?
假设我把创建的结构体放到0地址处,那么结构体成员的地址就是结构体成员相较于结构体起始位置偏移量,那么可以这样实现:
#define OFFSETOF(type, mem) (size_t)&(((type*)0)->mem)
将0地址看作结构体的起始地址,将0地址强制转换成结构体指针类型,取出结构体成员的地址,将其转换成无符号整形size_t类型。