c++ - <stddef.h> 中的 'offsetof' 宏是否会调用未定义的行为?

标签 c++ undefined-behavior offsetof

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/

相关文章:

c++ - 如何以实时方式接受键盘输入?

c - i = post_increment_i()的行为是指定的,未指定的还是未定义的?

c++ - C++ 中的结构偏移量和指针安全

c++ - 为什么 offsetof(member) 等于 sizeof(struct)?

c++ - 在 C++ 中评估默认参数在哪里?

c++ - 街头骰子模拟 - 似乎是代码偏差?

c++ - 访问呈现的 WPF 页面/窗口的底层 DirectX 表面/渲染目标

c++ - 我如何才能真正使用std::chrono类型而不冒溢出和未定义行为的风险?

c - 分配评估的顺序(我发现了我的第一个编译器错误吗?)

c++ - 从数据成员中获取非 POD 对象的地址,该数据成员是一次性嵌套类