C ++枚举和编译器依赖

时间:2011-06-27 12:08:24

标签: c++ enums

我目前有一个枚举的代码,其中设置了一个值,其余的由编译器使用前一个值+1设置,或者我希望如此。

此功能是否依赖于枚举类型编译器,下面的示例如下所示。

enum FUNC_ERROR_CODE    
{
    FUNC_SUCCESS,
    FUNC_ERROR_1 = 24,
    FUNC_ERROR_2,
    FUNC_ERROR_3
}

可以安全地假设FUNC_ERROR_2的值为25,而FUNC_ERROR_3的值为26,无论使用的编译器如何。

我正在对此进行编码,因为函数可以返回一个整数值,0总是成功,任何其他值都可以表示失败。

4 个答案:

答案 0 :(得分:6)

可以安全地假设:

  • 枚举声明[dcl.enum]
      

    枚举器列表中的标识符声明为常量,并且可以出现在常量的任何位置   需要。带=的枚举器定义为关联的枚举器提供由...指示的值   常量表达式。常量表达式应为整数或枚举类型。 如果是第一个   枚举器没有初始化器,相应常量的值为零。枚举器定义   没有初始值设定项为枚举数提供通过将上一个枚举数的值增加一个 获得的值。

  •   

如果您有类型安全枚举:使用!不要回归转换成整数。

答案 1 :(得分:1)

恕我直言,如果您的枚举必须具有固定值,然后明确地修复这些值,您将确定枚举中包含的值。

但是如果你只需要比较你的枚举,让编译器为你做。 写一些像if FUNC_ERROR_2 > FUNC_ERROR_1 ...

这样的比较应该是安全的

答案 2 :(得分:1)

就Visual Studio 2010而言,它是安全的。请查看msdn中的以下示例:

列表中的任何枚举器(包括第一个)都可以初始化为默认值以外的值。假设Suit的声明如下:

enum Suit {
   Diamonds = 5,
   Hearts,
   Clubs = 4,
   Spades
};

然后,钻石,心形,俱乐部和黑桃的价值分别为 5,6,4和5 。请注意,5不止一次使用。

答案 3 :(得分:0)

我很确定编译器被强制为每个新值递增。