手动声明枚举和设置值不按递增顺序

时间:2013-07-19 14:31:25

标签: c++

C ++中枚举的定义和随机顺序设置值是否有效?它是否用在任何众所周知的代码中? e.g:

enum ESampleType{ STPositiveControl='P', STNegativeControl='N', STSample='S' };

VS2008编译时没有警告。我想知道gcc会不会。 在我看来,它最不利于“最小惊喜规则”使用

迭代所有值
for(int i=STPositiveControl; i<=STSample; ++i)

会失败。

P.S:这种方法的基本原理: 在我的数据库应用程序中,我正在定义包装器方法。某些列包含编码为“常量”的列 单个字符。我试图让它更安全一点。

2 个答案:

答案 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一样,枚举的值并不总是有序的,连续的和唯一的。)