在使用 C++ 时,我发现以下代码
enum E* kind;
int main() { }
在 MSVC v19.latest 上编译。我预计这会失败,因为
E
尚未声明。 GCC 和 Clang 给出适当的错误消息
错误:使用枚举“E”而没有事先声明
和
错误:ISO C++ 禁止前向引用“枚举”类型
分别。
为什么上面的代码可以在MSVC上编译? MSVC 不遵循标准吗?是 UB、错误还是功能?
为什么上面的代码可以在 MSVC 上编译?
因为您在启用 Microsoft 扩展的情况下进行编译。
与许多实现一样,MSVC 默认情况下会偷偷启用它们。
MSVC不遵循标准吗?
C++ 标准表明您的代码不是有效的 C++。然而,没有什么可以阻止“扩展”C++ 语言的实现,为非合法 C++ 程序赋予意义。这就是 MSVC 在这里所做的事情。 如果您在编译时禁用
语言扩展,MSVC v19.latest 将拒绝它并显示错误消息
error C3432: 'E': a forward declaration of an unscoped enumeration must have an underlying type