[英]C/C++ Create an enum with negative values, without having to number it
例如在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;
但是,如果我想添加另一种水果,我必须分配另一个值,如果我在其中放置一个,我必须重新编号其中的大部分。 有更简单的方法吗?
首先从INT_MIN
开始,如下所示:
#include <limits.h>
enum fruits
{
orange = INT_MIN,
lemon,
...
}
根据C11标准INT_MIN
“ INT_MIN
整数类型的大小 ”和/或“ 附件E / 1 ”至少为-32767
。
INT_MIN
通过包含<limits.h>
定义。
在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;
在顶部添加新闻。 你仍然需要编号最顶层。
enum fruit
{
orange = -4,
lemon,
banana,
apple,
};
首先,没有“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的编译器。
我想你无论如何都可以订购它。
如果您没有给出任何值,则下一个enum
将获得其先前值的+1
。 如果即使拳头enum
没有任何值,那么它将从0
开始。
但好的做法是让它按正确的顺序排列。
将错误声明为通常的枚举并使用它的负值也是很常见的,例如:
typedef enum fruits_e {
APPLE=1,
BANANA,
LEMON,
ORANGE
} fruit_t;
fruit_t eat_fastfood(void) {
if (! me->healthy())
return -APPLE;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.