You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GCC 10.4中使用using enum语法?

问题:GCC 10.4编译C++20 using enum语法报错的解决方法

问题背景

我使用-std=gnu++2a参数编译C++20标准代码,原本想在switch语句中通过using enum foo::bar语法简化枚举成员的引用,但GCC 10.4编译时出现报错。

编译错误信息

main.cpp:69:11: error: expected nested-name-specifier before ‘enum’
   69 |     using enum foo::var;
      |           ^~~~

使用的GCC版本

arm-linux-g++.br_real (Buildroot 2022.02.5) 10.4.0

最小复现代码

#include <stdio.h>

namespace foo {
    enum class bar {
        George = 0,
        Mary,
        Martin,
        // ...
    };
}

void anyfunc(const foo::bar value) {
    // 可正常编译的代码
    switch (foo::bar(value)) {
        case foo::bar::George:
            printf("George");
        case foo::bar::Mary:
            printf("Mary");
        default:
            printf("Default");      
    }

    // 无法编译的代码
    // switch (foo::bar(value)) {
    //     using enum foo::bar;
    //     case George:
    //         printf("George");
    //     case Mary:
    //         printf("Mary");
    //     default:
    //         printf("Default");       
    // }
}

int main() {
    anyfunc(foo::bar::Mary);
    // ..
}

解决方案

原因分析

GCC 10.x系列对C20的using enum语法支持不完整——**在switch语句的作用域内直接声明using enum是C20的特性,但GCC直到11版本才完整支持该用法**。GCC 10.4仅实现了C++20的部分特性,不允许在switch的case列表中插入using enum声明。

具体解决办法

  1. 升级GCC版本到11及以上:这是最彻底的方案,升级后可以直接在switch内部使用using enum foo::bar语法。
  2. 将using enum移到switch外部的函数作用域:如果无法升级编译器,可把using enum foo::bar放在switch所在的函数开头,这样整个函数内都能直接引用枚举成员:
void anyfunc(const foo::bar value) {
    using enum foo::bar; // 移到函数作用域开头
    switch (foo::bar(value)) {
        case George:
            printf("George");
            break; // 原代码缺少break会导致分支穿透,建议补上
        case Mary:
            printf("Mary");
            break;
        default:
            printf("Default");      
    }
}
  1. 用局部作用域包裹switch:如果不想让using enum影响整个函数,可通过花括号创建独立局部作用域:
void anyfunc(const foo::bar value) {
    {
        using enum foo::bar;
        switch (foo::bar(value)) {
            case George:
                printf("George");
                break;
            case Mary:
                printf("Mary");
                break;
            default:
                printf("Default");       
        }
    }
    // 此区域无法直接引用George/Mary等枚举成员
}

注意:原代码的switch分支未添加break语句,会导致执行完一个case后继续执行后续分支,建议根据业务需求补充break。

内容的提问来源于stack exchange,提问作者eDeviser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 22:31:57