枚举中的元素数目

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

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

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

我不相信有。 但是,如果这些数字不是顺序的,那么你会如何处理这样一个数字,而且你还没有一个列表? 如果他们是连续的,但是以不同的数字开始,你总是可以这样做:

 enum blah { FIRST = 128, SECOND, THIRD, END }; const int blah_count = END - FIRST; 

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

 enum MyType { Type1, Type2, Type3, NumberOfTypes } 

NumberOfTypes将评估为3,这是实际types的数量。

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

你可以使用Xmacros

例:

 //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来说也是透明的,所以自动完成将会正常工作(就像在预处理器中完成的那样)。

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

我知道这是一个非常古老的问题,但由于接受的答案是错误的,所以我觉得不得不张贴我自己的。 我将重用接受的答案的例子,稍作修改。 (假定枚举是连续的。)

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

编辑:再次阅读文本,我有一个疑问。 这是否意味着不成为提供的项目的一部分? 这对我来说很奇怪,但是,我想这可能是有道理的。

那么,因为枚举不能在运行时改变,所以你可以做的最好的事情是:

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

但是,我发现很难设想这种情况能够派上用场。 你到底在做什么?

 int enaumVals[] = { FIRST, SECOND, THIRD, LAST }; #define NUM_ENUMS sizeof(enaumVals) / sizeof ( int ); 

尝试这个:

在这里输入图像说明

这是丑陋的,可能有一些编译器不喜欢它,但它通常工作和有用。 您可以使用它为每个枚举types。