求教个简单的 C++ 语法问题

查看 67|回复 3
作者:Betsy   
代码如下
#include
enum ExprValueType : uint8_t {
  MinInf = 1
};
int main(int argc, char* argv[]) {
  ExprValueType type = MinInf;
  std::cout
使用 g++ abc.cc -o a.out -std=c++20 报错,报错信息如下所示
abc.cc:3:20: error: found ‘:’ in nested-name-specifier, expected ‘::’
    3 | enum ExprValueType : uint8_t {
      |                    ^
      |                    ::
abc.cc:3:6: error: ‘ExprValueType’ has not been declared
    3 | enum ExprValueType : uint8_t {
      |      ^~~~~~~~~~~~~
abc.cc:3:30: error: expected unqualified-id before ‘{’ token
    3 | enum ExprValueType : uint8_t {
      |                              ^
abc.cc: In function ‘int main(int, char**)’:
abc.cc:8:3: error: ‘ExprValueType’ was not declared in this scope
    8 |   ExprValueType type = MinInf;
      |   ^~~~~~~~~~~~~
abc.cc:10:16: error: ‘type’ was not declared in this scope; did you mean ‘std::__cmp_cat::type’?
   10 |   std::cout
个人猜测是 gcc 版本的问题,于是在 https://gcc.godbolt.org/ 切换不同的编译器查看。
  • 发现自 x86-64 gcc 13.1 开始会报错,之前版本(比如 x86-64 gcc 12.3)就不会报错。
  • 同样 x86-64 clang 17.0.1 开始会报错,之前版本(比如 x86-64 clang 16.0.0 )就不会报错。

    于是产生了两个困惑
  • 编译器最近是出了什么新的标准导致不支持 enum 的这种写法了吗?
  • 如果想要在 x86-64 gcc 13.1 上跑起来,应该怎么改?

    添加头文件 #include 后就正常了。
    但是为什么之前版本的 gcc 就不需要添加这个头文件呢?

    std, type, include, x86-64

  • xipuxiaoyehua   
    添加头文件 #include 后就正常了。
    但是为什么之前版本的 gcc 就不需要添加这个头文件呢?
    Betsy
    OP
      
    enum class ExprValueType : uint8_t {
    MinInf = 1
    };
    xipuxiaoyehua   
    @xipuxiaoyehua 不可以的,从 Unscoped enumerations 换成 Scoped enumerations 依然存在这个问题。
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部