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

Joe*_*Joe 21 c c++ enums

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

typedef enum fruits{
   apple,
   banana,
   lemon,
   orange
} fruit_t;
Run Code Online (Sandbox Code Playgroud)

这相当于:

typedef enum fruits{
   apple = 0,
   banana = 1,
   lemon = 2,
   orange = 3
} fruit_t;
Run Code Online (Sandbox Code Playgroud)

但是,我希望这些值是负数,所以它们不会与其他任何东西发生冲突.我可以这样做:

typedef enum fruits{
   apple = -1,
   banana = -2,
   lemon = -3,
   orange = -4
} fruit_t;
Run Code Online (Sandbox Code Playgroud)

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

alk*_*alk 27

从这里开始INT_MIN:

#include <limits.h>

enum fruits
{
  orange = INT_MIN,
  lemon, 
  ...
}
Run Code Online (Sandbox Code Playgroud)

每个" 5.2.4.2.1整数类型的尺寸 "和/或C11标准的" 附件E/1 " INT_MIN至少是-32767.

INT_MIN通过包含来定义<limits.h>.


Sha*_*our 15

C中,您只需要对前一个条目进行编号,后续条目将是前一个条目+1,这在C99草案标准部分6.7.2.2 枚举说明符中有所说明(强调我的):

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

C++草案标准部分7.2 枚举声明2段中的措辞类似.

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

#define MIN -4

typedef enum fruits{
   orange = MIN,
   lemon,  
   banana,
   apple,
} fruit_t;
Run Code Online (Sandbox Code Playgroud)


Cha*_*had 7

在顶部添加新闻.你仍然需要编号最顶层.

enum fruit
{
   orange = -4,
   lemon,
   banana,
   apple,
};
Run Code Online (Sandbox Code Playgroud)


Moh*_*mel 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 
Run Code Online (Sandbox Code Playgroud)

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

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

这样做的另一个好处enum class是你可以设置枚举的大小.您可以使用任何有符号或无符号整数类型,如下所示:

enum class Traffic : char { red, yellow, green }
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Jeff,问题是关于使用负值来避免冲突.我的答案是引入一种不同的方法来解决同样的问题.所以我认为它正在解决这个问题 (3认同)