我打开stddef.h
看到这个:
#if defined _MSC_VER && !defined _CRT_USE_BUILTIN_OFFSETOF
#ifdef __cplusplus
#define offsetof(s,m) ((size_t)&reinterpret_cast<char const volatile&>((((s*)0)->m)))
#else
#define offsetof(s,m) ((size_t)&(((s*)0)->m))
#endif
#else
#define offsetof(s,m) __builtin_offsetof(s,m)
#endif
在(在 C++ 编译器的情况下)的分支中,__cplusplus
有一个非常奇怪的实现,我认为它是多余的。其他分支(C 编译器的情况)具有更简单的字段偏移计算。我测试了它,它有效。在第一种情况下使用这种奇怪的强制转换和类型限定符是为了什么?