gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:45:41 27 4
gpt4 key购买 nike

MSVC 实现的示例:

#define offsetof(s,m) \
(size_t)&reinterpret_cast<const volatile char&>((((s *)0)->m))
// ^^^^^^^^^^^

可以看出,它取消引用了一个空指针,这通常会调用未定义的行为。这是规则的异常(exception)还是正在发生的事情?

最佳答案

在语言标准说“未定义行为”的地方,任何给定的编译器都可以定义行为。标准库中的实现代码通常依赖于它。所以有两个问题:

(1) 代码是否符合C++标准?

这是一个非常难的问题,因为这是一个众所周知的几乎是缺陷,C++98/03 标准从来没有在规范文本中直接说出通常取消引用空指针是 UB。 隐含 typeid 的异常(exception)情况,不是 UB。

您可以肯定地说,将 offsetof 与非 POD 类型一起使用是 UB。

(2) 代码是否与它所针对的编译器有关?

不,当然不是。

编译器供应商针对给定编译器的代码可以使用该编译器的任何功能。

干杯,

关于c++ - <stddef.h> 中的 'offsetof' 宏是否会调用未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39260062/

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