c-枚举中的元素数

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

enum blah {
    FIRST,
    SECOND,
    THIRD,
    LAST
};

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

Peter Gibson asked 2020-08-11T17:02:37Z
8个解决方案
68 votes

如果您不分配枚举,则可以执行以下操作:

enum MyType {
  Type1,
  Type2,
  Type3,
  NumberOfTypes
}

NumberOfTypes的取值为3,这是实数的数量。

vpicaver answered 2020-08-11T17:03:09Z
36 votes

我不相信那里。 但是,如果这些数字不是连续的,而您还没有列表的话,您将如何处理呢? 如果它们是顺序的,但以不同的数字开头,则可以始终这样做:

enum blah {
    FIRST = 128,
    SECOND,
    THIRD,
    END
};
const int blah_count = END - FIRST;
Brian Campbell answered 2020-08-11T17:02:44Z
24 votes

老问题,我知道。 这是针对具有相同问题的Google员工的。

您可以使用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

这对于IDE也是透明的,因此自动完成功能可以正常工作(因为所有操作都在预处理器中完成)。

Sam answered 2020-08-11T17:03:42Z
7 votes

抱歉不行。 那没有。

rlbond answered 2020-08-11T17:04:03Z
5 votes

我知道这是一个非常老的问题,但是由于公认的答案是错误的,因此我不得不发表自己的看法。 我将重用已接受答案的示例,并对其进行一些修改。(假设枚举是顺序的。)

// 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.

任何开发人员都知道原因: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

编辑:再次阅读文字,我对此表示怀疑。 那END是否不属于所提供的物品? 在我看来,这很奇怪,但是,我想这可能是有道理的...

David Stosik answered 2020-08-11T17:04:32Z
3 votes

好吧,由于枚举在运行时无法更改,因此您可以做的最好的事情是:

enum blah {
    FIRST = 7,
    SECOND = 15,
    THIRD = 9,
    LAST = 12
};
#define blahcount 4 /* counted manually, keep these in sync */

但是我发现很难设想这种情况会派上用场的情况。 您到底想做什么?

paxdiablo answered 2020-08-11T17:04:57Z
3 votes
int enaumVals[] =
{
FIRST,
SECOND,
THIRD,
LAST
};

#define NUM_ENUMS sizeof(enaumVals) / sizeof ( int );
iuoi answered 2020-08-11T17:05:13Z
0 votes
#include <stdio.h>

// M_CONC and M_CONC_ come from https://stackoverflow.com/a/14804003/7067195
#define M_CONC(A, B) M_CONC_(A, B)
#define M_CONC_(A, B) A##B

#define enum_count_suffix _count
#define count(tag) M_CONC(tag, enum_count_suffix)
#define countable_enum(tag, ...) \
  enum tag {__VA_ARGS__}; \
  const size_t count(tag) = sizeof((int []) {__VA_ARGS__}) / sizeof(int)

// The following declares an enum with tag `color` and 3 constants: `red`,
// `green`, and `blue`.
countable_enum(color, red, green, blue);

int main(int argc, char **argv) {
  // The following prints 3, as expected.
  printf("number of elements in enum: %d\n", count(color));
}
mathedpotatoes answered 2020-08-11T17:05:28Z
translate from https://stackoverflow.com:/questions/712463/number-of-elements-in-an-enum