来自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/