不按递增顺序手动取消枚举和设置值
Declearing enum and setting values manually not in increasing order
C++中枚举的定义和按随机顺序设置值是否有效?它在任何知名的代码中使用过吗?例如:
enum ESampleType{ STPositiveControl='P', STNegativeControl='N', STSample='S' };
VS2008编译时没有警告。我想知道gcc会不会。在我看来,使用迭代所有值是危害最小的"最小意外规则"
for(int i=STPositiveControl; i<=STSample; ++i)
将失败。
p.S:这种方法的基本原理是:在我的DB应用程序中,我正在定义包装器方法。某些列包含编码为的"常量"单个字符。我想让它更安全一点。
这是一个标准且广泛使用的特性。大多数时候(但是不总是)它将用于创建位图,但它也可以如图所示,用于为枚举提供"可打印"值传染病。
它不应该让任何了解C++的人感到惊讶,因为它是广泛的习惯于
是的,它是有效的。
Bjarne Stroustrup的《C++编程语言(第三版)》一书中有一个例子,"6.1桌面计算器[expr.Calculator]"一节(更确切地说是"6.1.1解析器[expr.Parser]"),用于简单算术计算器的解析器代码。摘录如下:
解析器使用函数
get_token()
来获取输入。get_token()
的最近调用的值可以在全局变量curr_tok
中找到。curr_tok
的类型是枚举Token_value
:enum Token_value { NAME, NUMBER, END, PLUS='+', MINUS='-', MUL='*', DIV='/', PRINT=';', ASSIGN='=', LP='(', RP=')' }; Token_value curr_tok = PRINT;
用其字符的整数值表示每个令牌既方便又高效,并且可以帮助使用调试器的人。只要用作输入的字符没有用作枚举器的值,而且据我所知,没有一个字符集的打印字符具有个位数的整数值,这就可以工作。(…)
(最后一句话是这个例子特有的,因为枚举混合了"默认值"answers"显式值"枚举器,并希望每个枚举器都是唯一的。)
然而,这只是一个教育性的例子(值得注意的是,当你应该为宏保留枚举器时,它使用了全局变量和CAPS名称(但Stroustrup不喜欢宏:p))。
现在,您确实无法对其进行迭代(至少使用普通的for
循环;但请参阅这个问题)。(正如James Kanze所指出的,枚举的值并不总是有序、连续和唯一的。)
- 不带大括号的枚举形式
- 枚举环境变量的惯用C++14/C++17方法
- 类似枚举的计算常量
- 如何正确实现和访问运算符的各种自定义枚举器
- 错误:从"int"到枚举c++的转换无效
- C++中构造函数中的枚举
- 访问在 C++ 结构中声明的枚举变量
- 枚举类'classname'的多重定义
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- typedef 枚举和枚举类有什么区别?
- 为什么我的开关/机箱在使用枚举时默认?
- 标准::可选枚举的比较运算符
- C++两个源文件之间共享的枚举的静态实例
- 打印没有铸件的枚举可以在C++中吗?
- 枚举成员与静态 int 成员?
- C++:枚举:错误:应使用标识符而不是"}"
- 带有 c++ 的枚举(输入检查)
- 在 qml 中使用 Q_ENUM 和 Q_PROPERTY 作为枚举类
- (取消)序列化枚举类
- 不按递增顺序手动取消枚举和设置值