#define offsetof(s,m) ((::size_t)&reinterpret_cast<char const volatile&>((((s*)0)->m)))
我已经找了几分钟这段代码,但我仍然不明白 const char volatile 引用是什么东西,这让我很头疼。
#define offsetof(s,m) ((size_t)&(((s*)0)->m))
这个很清楚,确实有道理,而且效果很好,为什么另一个被 MSVC 编译器使用。
最佳答案
如果 s::m
是类类型,它可以重载 operator&
,所以 &(((s*)0)->m)
与 (((s*)0)->m).operator&()
相同,它可能会做一些意想不到的事情。
为了不使用任何自定义的operator&
,首先将其转换为const volatile char&
(将具有相同的地址)。它需要同时是 const
和 volatile
因为 s::m
可能是 const 和/或 volatile。
这就是std::addressof
会在 C++11 之前实现。
关于c++ - C++ 中的 offsetof 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70979477/