我打开了 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编译器的else分支中,字段偏移量的计算更简单。 我已经测试过它,它能够正常工作。 那么第一种情况下使用这些奇怪的转换和类型限定符有什么用呢?
int a = 24; float f = *reinterpret_cast<float*>(&a);
这个代码可以编译而没有任何错误。 - bolov