不按递增顺序手动取消枚举和设置值

Declearing enum and setting values manually not in increasing order

本文关键字:枚举 取消 设置 顺序      更新时间:2023-10-16

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所指出的,枚举的值并不总是有序、连续和唯一的。)