C ++中枚举的定义和随机顺序设置值是否有效?它是否用在任何众所周知的代码中? e.g:
enum ESampleType{ STPositiveControl='P', STNegativeControl='N', STSample='S' };
VS2008编译时没有警告。我想知道gcc会不会。 在我看来,它最不利于“最小惊喜规则”使用
迭代所有值for(int i=STPositiveControl; i<=STSample; ++i)
会失败。
P.S:这种方法的基本原理: 在我的数据库应用程序中,我正在定义包装器方法。某些列包含编码为“常量”的列 单个字符。我试图让它更安全一点。
答案 0 :(得分:5)
这是一个标准且广泛使用的功能。大部分时间(但是 并非总是如此)它将用于创建位图,但它也可以 在显示时使用,为枚举提供“可打印”值 contants。
任何知道C ++的人都不应该感到惊讶,因为它很广泛 使用
答案 1 :(得分:2)
是的,它是有效的。
Bjarne Stroustrup在 C ++编程语言(第3版)一书中使用了它的一个例子,“6.1 A Desk Calculator [expr.calculator]”(更确切地说是“6.1” .1 Parser [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;
通过字符的整数值表示每个标记既方便又有效,可以帮助使用调试器的人。只要没有用作输入的字符具有用作枚举器的值,这就可以工作 - 并且我所知道的字符集没有具有单个数字整数值的打印字符。 (...)
(最后一句特定于此示例,因为枚举混合了“default-value”和“explicit-value”枚举器,并希望每个枚举符都是唯一的。)
然而,它只是一个教育性的例子(特别是它使用全局变量,当你应该为宏保留它们时,枚举器的CAPS名称(但是Stroustrup不喜欢宏:p))。
现在,确实你不能迭代它(至少使用普通的for
循环;但是请看this question)。 (和as James Kanze pointed一样,枚举的值并不总是有序的,连续的和唯一的。)