C++ C/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{
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
。如果fistenum
没有任何值,则它将从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;}
-我从未期望需要否定我的案例(希望这至少在某个地方有文档记录,否则我只能在我的程序没有按预期工作后通过调试或记录/打印值来发现)。