C++11作用域枚举用关键字default引发跨编译器兼容问题咨询
问题解答
核心结论
default是C标准规定的全局保留关键字,无论在什么上下文(包括作用域枚举的枚举值名称),都不能用作用户自定义的标识符——你的代码本质上违反了C标准。
具体解释
1. 关于C++标准的规定
C++中的保留关键字(比如default、switch、class等)是语言语法的核心组成部分,在所有代码场景中都不允许被用作标识符,不存在“仅限定switch场景”的说法。default的用途不止switch语句:它还用于显式默认函数定义(比如MyClass() = default;),因此被列为全局保留关键字,任何用户自定义的名称都不能与之重名。
2. MSVC与GCC行为差异的原因
- GCC严格遵循C++标准,因此会直接抛出错误,拒绝编译违反标准的代码。
- MSVC提供了非标准的语言扩展,允许在枚举(包括作用域枚举)中使用保留关键字作为枚举值名称。这是微软为兼容旧代码或提供便利的特殊处理,但不属于标准C++的范畴。
替代方案
如果你觉得defaultView过于冗余,可以选择更简洁的命名方式,比如:
- 下划线后缀:
default_ - 语义替代:
normal(如果符合业务逻辑)
修改后的代码示例:
enum class viewState { off, min, default_, max };
内容的提问来源于stack exchange,提问作者brettgrant99
相关产品推荐
相关产品推荐

