在C语言中,`enum`可以向后计数吗?

问题描述 投票:0回答:2

我想创建一个用于错误处理的负值枚举列表,因此 <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
开始计算负数,而不是使用上面的方法?

c error-handling enums
2个回答
0
投票

你想要的东西是不可能的。未分配显式值的枚举标识符的值必须比先前标识符大 1,或者第一个标识符的值必须为 0。

关于枚举说明符的C 标准第 6.7.2.2p3 节对此进行了详细说明:

如果第一个枚举器有 没有

=
,其枚举常量的值为 0。后续每个没有
=
的枚举器 将其枚举常量定义为通过以下方式获得的常量表达式的值 前一个枚举常量的值加 1。

虽然编译器可能支持不同的排序作为扩展,但我不知道有任何编译器支持此类功能。


0
投票

您可以使用“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
};
© www.soinside.com 2019 - 2024. All rights reserved.