4

我打开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 编译器的情况)具有更简单的字段偏移计算。我测试了它,它有效。在第一种情况下使用这种奇怪的强制转换和类型限定符是为了什么?

4

1 回答 1

11

operator &的类型可以重载m,所以&((s*)0)->m)会调用它operator &而不是获取m' 的地址。

并且const volatilereinterpret_cast's 类型中是否存在,以便即使在misconst和/或volatile.

请注意,在 C++11 中,无论重载如何,std::addressof(x)它总是采用地址。它可能以与您在问题中看到的类似方式实现。xoperator &

于 2017-11-10T09:57:16.320 回答