c++ - C++ 中的 offsetof 宏

标签 c++ pointers

#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&(将具有相同的地址)。它需要同时是 constvolatile 因为 s::m 可能是 const 和/或 volatile。

这就是std::addressof会在 C++11 之前实现。

关于c++ - C++ 中的 offsetof 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70979477/

相关文章:

.net - 在 .NET API 中包装 MFC Doc/View 应用程序的最佳方式?

c++ - 迭代器 VS const_iterator,与 distance() 一起使用

c++ - std::reference_wrapper 的实现

c - 如何在不使用循环、递归或 goto 语句的情况下打印一系列数值?

c++ - std::mt19937 为相同的第一个 float ex(1.2, 1.5) 给出相同的随机 float

c++ - 使用 Gloox C/C++ 的 XMPP 握手流程

c - 什么情况下应该使用函数签名void *(*)()?

c++ - C++代码说明

c - 这两个陈述有什么区别?

C - fgets 返回损坏的数据