来自MSVC实现的示例:

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

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

最佳答案

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

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

这是一个非常棘手的问题,因为众所周知,C++ 98/03标准从未在规范性文本中直接指出(通常是UB取消引用空指针),这几乎是一种缺陷。它不是UB的typeid的异常所隐含。

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

(2)代码UB是否与为其编写的编译器有关?

不,当然不是。

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

干杯,……

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

10-11 23:18
查看更多