C / C ++创建一个带负值的枚举,无需编号

时间:2014-01-09 17:37:41

标签: c++ c enums

例如在C / C ++中,我会得到代码:

typedef enum fruits{
   apple,
   banana,
   lemon,
   orange
} fruit_t;

这相当于:

typedef enum fruits{
   apple = 0,
   banana = 1,
   lemon = 2,
   orange = 3
} fruit_t;

但是,我希望这些值是负数,因此它们不会与其他任何内容发生冲突。我可以这样做:

typedef enum fruits{
   apple = -1,
   banana = -2,
   lemon = -3,
   orange = -4
} fruit_t;

但是,如果我想添加另一种水果,我必须分配另一个值,如果我把它放在其中,我必须重新编号其中的大部分。有没有更简单的方法呢?

6 个答案:

答案 0 :(得分:24)

INT_MIN开头,如下所示:

#include <limits.h>

enum fruits
{
  orange = INT_MIN,
  lemon, 
  ...
}

Per&#34; 5.2.4.2.1整数类型的大小&#34;和/或&#34; 附件E / 1 &#34; C11标准版INT_MIN至少-32767

通过加入INT_MIN来定义

<limits.h>

答案 1 :(得分:15)

C 中,您只需要对前一个条目进行编号,后续条目将是上一个条目+1C99 draft standard部分6.7.2.2中对此进行了介绍枚举说明符表示(强调我的):

  

[...]带有=的枚举数将其枚举常量定义为常量表达式的值。如果第一个枚举数没有=,则其枚举常量的值为0. 每个后续枚举数为no =将其枚举常量定义为通过将1 加到该值得到的常量表达式的值。先前的枚举常数。[...]

并且C++ draft standard部分7.2 枚举声明 2 中的措辞类似。

所以,只需做类似以下的事情:

#define MIN -4

typedef enum fruits{
   orange = MIN,
   lemon,  
   banana,
   apple,
} fruit_t;

答案 2 :(得分:7)

在顶部添加新闻。你仍然需要编号最重要的一个。

enum fruit
{
   orange = -4,
   lemon,
   banana,
   apple,
};

答案 3 :(得分:7)

首先,没有“C / C ++”这样的东西,它们是两种不同的语言。 您不能将C视为C ++的子集;一些合法的C代码不能编译为C ++程序。

如果您可以使用C ++ 11,我建议您使用enum class,它会为您提供强类型枚举

enum class Traffic {red , yellow, green};
Traffic t = Traffic::red;

if ( t == Traffic::red )  // to test the value of an enum 

这样你就可以保证不会发生冲突,因为编译器不允许你用整数或不同枚举类型的变量进行任何比较。

您只能与同一枚举类型的变量进行比较,或者使用示例中的二进制作用域解析运算符。

enum class的另一个优点是您可以设置枚举的大小。您可以使用任何有符号或无符号整数类型,如下所示:

enum class Traffic : char { red, yellow, green }

如果未指定类型,则默认为int

请注意,您需要一个支持C ++ 11的编译器。

答案 4 :(得分:4)

我认为无论如何你都可以订购它。

如果您没有提供任何价值,则下一个enum将获取其先前值的+1。即使拳enum没有任何价值,它也会从0开始。

但良好的做法是让它按正确的顺序排列。

答案 5 :(得分:1)

将错误声明为通常的枚举也是很常见的 使用它的负值,如:

typedef enum fruits_e {
    APPLE=1,
    BANANA,
    LEMON,
    ORANGE
} fruit_t;

fruit_t eat_fastfood(void) {
    if (! me->healthy())
        return -APPLE;
}