枚举中的元素数目
在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。