我想创建一个用于错误处理的负值枚举列表,因此 <0 is an error and >=0 对于某些函数有效:
int f() {
if (someerror())
return ERR_TYPE_2;
else
return 0;
}
main() {
if (f() < 0) blow_up();
else profit();
}
我知道 C (
enum
) 中的枚举默认从 0 开始计数,我可以像这样分配它们:
enum {
ERR_TYPE_1 = -1,
ERR_TYPE_2 = -2,
ERR_TYPE_3 = -3
}
或者我通过从枚举永远不会达到的任意负值开始“自动”获得任意负枚举:
enum {
ERR_TYPE_1 = -100,
ERR_TYPE_2 // -99
ERR_TYPE_3 // -98 ...
}
问题:有没有办法告诉
enum
从-1
开始计算负数,而不是使用上面的方法?
你想要的东西是不可能的。未分配显式值的枚举标识符的值必须比先前标识符大 1,或者第一个标识符的值必须为 0。
关于枚举说明符的C 标准第 6.7.2.2p3 节对此进行了详细说明:
如果第一个枚举器有 没有
,其枚举常量的值为 0。后续每个没有=
的枚举器 将其枚举常量定义为通过以下方式获得的常量表达式的值 前一个枚举常量的值加 1。=
虽然编译器可能支持不同的排序作为扩展,但我不知道有任何编译器支持此类功能。
您可以使用“X-MACROS”来完成此操作。一般概念是,它们定义一次列表,但从该列表生成多个源代码片段,并且从列表到源代码的转换发生变化。
myenum.enm
ENM_X(ERR_NOTFOUND)
ENM_X(ERR_TOOHARD)
ENM_X(ERR_STACKOVERFLOW)
enum myenum_helper
{
skipzero,
#define ENM_X(ID) ID##helper,
#include "myenum.enm"
#undef ENM_X
};
enum myenum
{
#define ENM_X(ID) ID = -ID##helper,
#include "myenum.enm"
#undef ENM_X
};