MSVC:为什么在没有事先声明的情况下使用枚举可以编译?

问题描述 投票:0回答:1

在使用 C++ 时,我发现以下代码

enum E* kind;
int main() { }

在 MSVC v19.latest 上编译。我预计这会失败,因为

E
尚未声明。 GCC 和 Clang 给出适当的错误消息

错误:使用枚举“E”而没有事先声明

错误:ISO C++ 禁止前向引用“枚举”类型

分别。

为什么上面的代码可以在MSVC上编译? MSVC 不遵循标准吗?是 UB、错误还是功能?

c++ visual-c++ enums language-lawyer declaration
1个回答
2
投票

为什么上面的代码可以在 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

© www.soinside.com 2019 - 2024. All rights reserved.