3

C++ 中枚举的定义和随机顺序设置值是否有效?它是否在任何知名代码中使用?例如:

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

VS2008 编译时没有警告。我想知道 gcc 是否会。在我看来,它对“最小意外规则”的危害最小,因为它使用迭代所有值

for(int i=STPositiveControl; i<=STSample; ++i)

会失败。

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

4

2 回答 2

5

这是一个标准且广泛使用的功能。大多数时候(但并非总是)它将用于创建位图,但也可以如您所见,为枚举内容提供“可打印”值。

任何了解 C++ 的人都不会感到惊讶,因为它被广泛使用。

于 2013-07-19T14:33:25.910 回答
3

是的,它是有效的。

在 Bjarne Stroustrup 的《 The C++ Programming Language (3rd Edition)》一书中有一个使用它的例子,“6.1 A Desk Calculator [expr.calculator]”一节(更准确地说是“6.1.1 The 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;

用字符的整数值来表示每个标记既方便又高效,并且可以帮助使用调试器的人。只要用作输入的字符没有用作枚举器的值,并且我所知道的没有字符集具有具有个位数整数值的打印字符,这就会起作用。(...)

(最后一句特定于此示例,因为枚举混合了“默认值”和“显式值”枚举器,并希望每个枚举器都是唯一的。)

然而,这只是一个有教育意义的例子(特别是它使用全局变量,当您应该为宏保留枚举器时,它使用 CAPS 名称(但 Stroustrup 不喜欢宏:p))。

现在,确实你不能迭代它(至少用一个普通的for循环;但是看这个问题)。(正如 James Kanze 指出的那样,枚举的值并不总是有序、连续和唯一的。)

于 2013-07-19T18:46:13.463 回答