C++ C/C++;创建具有负值的枚举,而不必对其进行编号

C++ C/C++;创建具有负值的枚举,而不必对其进行编号,c++,c,enums,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{

例如,在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;
#include <limits.h>

enum fruits
{
  orange = INT_MIN,
  lemon, 
  ...
}
enum class Traffic : char { red, yellow, green }

但是,如果我想添加另一个水果,我必须指定另一个值,如果我将其中一个放在中间,我必须对大部分水果重新编号。有更简单的方法吗?

我想你可以随便点

如果您没有给出任何值,则next
enum
将取其上一个值的
+1
。如果fist
enum
没有任何值,则它将从
0
开始


但好的做法是将其按正确的顺序排列。

在顶部添加新闻。你还得给最上面的那个编号

enum fruit
{
   orange = -4,
   lemon,
   banana,
   apple,
};
在C语言中,您只需对前一个条目进行编号,随后的条目将是前一个条目
+1
,这将在
6.7.2.2
枚举说明符一节中介绍,该节说明(重点):

[…]带=的枚举数将其枚举常量定义为常量表达式的值。如果第一个枚举数没有=,则其枚举常量的值为0每个编号为的后续枚举数将其枚举常量定义为常量表达式的值,该表达式通过将1添加到上一个枚举常量的值中获得。[…]

第7.2节和第2段中的措辞类似

因此,只需执行以下类似操作:

#define MIN -4

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

从顶部的
INT\u MIN
开始,如下所示:

typedef enum fruits{
   apple = -1,
   banana = -2,
   lemon = -3,
   orange = -4
} fruit_t;
#include <limits.h>

enum fruits
{
  orange = INT_MIN,
  lemon, 
  ...
}
enum class Traffic : char { red, yellow, green }
#包括
列举水果
{
橙色=整数分钟,
柠檬,
...
}
根据C11标准的“5.2.4.2.1整型尺寸”和/或“附录E/1”
INT\u MIN
至少为
-32767


INT\u MIN
是通过包含

来定义的。首先,没有“C/C++”这样的东西,这是两种不同的语言。 你不能把C看成是C++的子集;有些法律C代码不能作为C++程序编译。 如果您可以使用C++11,我建议您使用
enum类
,它提供强类型枚举:

这样可以保证没有冲突,因为编译器不允许您与整数或不同枚举类型的变量进行任何比较

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

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

typedef enum fruits{
   apple = -1,
   banana = -2,
   lemon = -3,
   orange = -4
} fruit_t;
#include <limits.h>

enum fruits
{
  orange = INT_MIN,
  lemon, 
  ...
}
enum class Traffic : char { red, yellow, green }
如果未指定类型,则假定默认的
int


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

将错误声明为常规枚举和 使用它的负值,如:

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

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

您应该使用C++11作用域枚举。没有C/C++这样的东西。@LightnessRacesinOrbit:除非目的是编写一个在任何一种语言中都可用的定义;在这种情况下,将其称为“C/C++”是非常合理的。如果函数返回枚举,我希望它返回枚举中实际定义的值,因此我可以执行
切换(eat_fastFood()){case APPLE:case BANANA:case LEMON:case ORANGE:break;}
-我从未期望需要否定我的案例(希望这至少在某个地方有文档记录,否则我只能在我的程序没有按预期工作后通过调试或记录/打印值来发现)。