C++中的offsetof宏

zak*_*mkn 2 c++ pointers

#define offsetof(s,m) ((::size_t)&reinterpret_cast<char const volatile&>((((s*)0)->m)))
Run Code Online (Sandbox Code Playgroud)

我已经找了这个代码几分钟了,但我仍然不明白 const char 易失性引用是什么,这让我很头疼。

#define offsetof(s,m) ((size_t)&(((s*)0)->m))
Run Code Online (Sandbox Code Playgroud)

这个非常清楚,确实有意义并且运行良好,为什么 MSVC 编译器使用另一个。

Art*_*yer 5

如果s::m是类类型,它可能会重载operator&,因此&(((s*)0)->m)与 相同(((s*)0)->m).operator&(),这可能会做出意想不到的事情。

为了不使用任何 custom operator&,它被转换为const volatile char&第一个(它将具有相同的地址)。它必须同时是constandvolatile因为s::m可能是 const 和/或 volatile。

这是std::addressofC++11 之前的实现方式。