如何在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声明。
具体解决办法
- 升级GCC版本到11及以上:这是最彻底的方案,升级后可以直接在switch内部使用
using enum foo::bar语法。 - 将
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"); } }
- 用局部作用域包裹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
相关产品推荐
相关产品推荐

