枚举中的元素数量

Pet*_*son 41 c enums

在C中,是否有一种很好的方法来跟踪枚举中的元素数量?我见过

enum blah {
    FIRST,
    SECOND,
    THIRD,
    LAST
};
Run Code Online (Sandbox Code Playgroud)

但这仅在项目是连续的并且从零开始时才有效.

vpi*_*ver 69

如果你没有分配你的枚举,你可以做这样的事情:

enum MyType {
  Type1,
  Type2,
  Type3,
  NumberOfTypes
}
Run Code Online (Sandbox Code Playgroud)

NumberOfTypes将评估为3,这是真实类型的数量.

  • 晚期回答@JohnyTex,但C标准在'枚举说明符'中提到:`如果第一个枚举器没有=,则其枚举常量的值为0.每个后续枚举数为no =将其枚举常量定义为常量的值通过在前一个枚举常量的值上加1得到的表达式.所以是的,这适用于任何符合标准的实现. (4认同)
  • 好招!显然是最简单的枚举枚举 (2认同)
  • 您是否始终可以确保在每个C实现中,枚举始终从0开始?我这么认为,但它总是如此真实吗? (2认同)

Bri*_*ell 36

我不相信有.但是,如果这些数字不是连续的,你会用这个数字做什么呢?你还没有在某个地方列出这些数字?如果它们是连续的但是从不同的数字开始,你可以随时做:

enum blah {
    FIRST = 128,
    SECOND,
    THIRD,
    END
};
const int blah_count = END - FIRST;
Run Code Online (Sandbox Code Playgroud)

  • 不,你会得到FIRST = -9 SECOND = -8 THIRD = -7 END = -6,所以你有-6 - ( - 9)= -6 + 9 = 3 (13认同)
  • 无需提防; 减法适用于负数.Pax说得对. (3认同)
  • FIRST=-2 仍然可以正确计算,我认为:1 - (-2) = 3。 (2认同)
  • 第一 = -200,第二 = -199,第三 = -198,结束 = -100。-200 - (-100) = 坏消息 (2认同)

Sam*_*Sam 24

老问题,我知道.这是针对具有相同问题的googlers.

你可以使用X-Macros

例:

//The values are defined via a map which calls a given macro which is defined later
#define ENUM_MAP(X) \
      X(VALA, 0)    \
      X(VALB, 10)   \
      X(VALC, 20)

//Using the map for the enum decl
#define X(n, v) [n] = v,
typedef enum val_list {
    ENUM_MAP(X) //results in [VALA] = 0, etc...
} val_list;
#undef X

//For the count of values
#define X(n, v) + 1
int val_list_count = 0 + ENUM_MAP(X); //evaluates to 0 + 1 + 1 + 1
#undef X
Run Code Online (Sandbox Code Playgroud)

这对IDE也是透明的,因此自动完成将正常工作(因为它完全在预处理器中完成).

  • 太棒了,我来这里实际上是因为我正在寻找一种好方法来确定 X_MACRO 中元素的_数量_,这是一个好方法。 (2认同)

rlb*_*ond 7

很不幸的是,不行.那没有.


Dav*_*sik 5

我知道这是一个非常古老的问题,但由于接受的答案是错误的,我觉得有必要发布我自己的问题.我将重用已接受的答案的示例,稍加修改.(假设枚举是连续的.)

// Incorrect code, do not use!
enum blah {
  FIRST   =  0,
  SECOND, // 1
  THIRD,  // 2
  END     // 3
};
const int blah_count = END - FIRST;
// And this above would be 3 - 0 = 3, although there actually are 4 items.
Run Code Online (Sandbox Code Playgroud)

任何开发者都知道原因:count = last - first + 1.这适用于任何符号组合(两端为负,均为正,或仅为第一端为负).你可以试试.

// Now, the correct version.
enum blah {
  FIRST   =  0,
  SECOND, // 1
  THIRD,  // 2
  END     // 3
};
const int blah_count = END - FIRST + 1; // 4
Run Code Online (Sandbox Code Playgroud)

编辑:再次阅读文本,我有一个疑问.这是否END意味着不属于所提供的项目?这对我来说很奇怪,但是,我想这可能有意义......

  • 意图是枚举中有 3 个元素(`FIRST、SECOND 和 THIRD`),最后一个是始终指定列表末尾的占位符,因此如果添加了其他项目,则无需更改项目计数的公式。 (2认同)