MSVC 的实现示例:
#define offsetof(s,m) \
(size_t)&reinterpret_cast<const volatile char&>((((s *)0)->m))
// ^^^^^^^^^^^
可以看出,它取消引用一个空指针,这通常会调用未定义的行为。这是规则的异常(exception)还是发生了什么?
最佳答案
如果语言标准说“未定义的行为”,任何给定的编译器都可以定义该行为。标准库中的实现代码通常依赖于此。所以有两个问题:
(1) 代码相对于 C++ 标准是 UB 吗?
这是一个非常困难的问题,因为这是一个众所周知的几乎缺陷,C++98/03 标准从未在规范性文本中明确指出,通常它是取消引用空指针的 UB。它暗示由 typeid
的异常(exception),它是 not UB。
您可以肯定地说,将 offsetof
与非 POD 类型一起使用是 UB。
(2) 代码相对于它所针对的编译器而言是 UB 吗?
不,当然不是。
给定编译器的编译器供应商代码可以使用该编译器的任何功能。
干杯,
关于c++ - <stddef.h> 中的 'offsetof' 宏是否会调用未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6433339/