【问题标题】:ISO C++ forbids forward references to 'enum' typesISO C++ 禁止对“枚举”类型的前向引用
【发布时间】:2016-12-11 04:31:23
【问题描述】:

给定程序:

enum E : int
{
    A, B, C
};

g++ -c test.cpp 工作得很好。但是,clang++ -c test.cpp 给出以下错误:

test.cpp:1:6: error: ISO C++ forbids forward references to 'enum' types
enum E : int
     ^
test.cpp:1:8: error: expected unqualified-id
enum E : int
       ^
2 errors generated.

这些错误消息对我来说没有任何意义。我在这里看不到任何前向引用。

【问题讨论】:

  • FWIW,GCC 现在(从 5 或 6 开始)使用 ‑std=c++14 作为默认编译,而 Clang 仍然使用 ‑std=c++98 AFAIK。
  • 我认为如果您包含编译器版本和选项会有所帮助。
  • 这对我来说似乎是一个合理的问题,它不是印刷错误,也不是寻求调试帮助但不包含代码和错误消息的问题。
  • 没有投票,但是当您使用 C++11 功能并收到奇怪的错误消息时,首先要尝试使用 -std=c++11
  • 当时不知道这是 C++11 的特性。语法不是新的——MS 编译器至少从 VS2005 开始就支持这种语法。

标签: c++ clang


【解决方案1】:

为枚举指定基础类型是 C++11 语言功能。要编译代码,您必须添加开关-std=c++11。这适用于 GCC 和 Clang。

对于 C++03 中的枚举,底层整数类型是实现定义的,除非枚举数的值不能适合 int 或 unsigned int。 (但是,自 VS 2005 起,Microsoft 的编译器允许将枚举的底层类型指定为专有扩展。)

【讨论】:

  • 你是对的:如果你使用选项 -std=c++11 编译是有效的 (online demo)。使用超过 6 的 gcc 会给你一个明确的警告。使用 gcc 6 不需要 std 标志。
  • @Christophe:也就是说:使用 gcc 6,他们(最终)将其更改为默认编译 C++11,并且需要切换以符合旧标准。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
相关资源
最近更新 更多