gpt4 book ai didi

c++ - 中的 'offsetof' 宏是否会调用未定义的行为?

转载 作者:IT老高 更新时间:2023-10-28 22:00:13 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com