在C中,是否有一种很好的方法来跟踪枚举中的元素数量?我见过
enum blah { FIRST, SECOND, THIRD, LAST };
但这仅在项目是连续的并且从零开始时才有效.
如果你没有分配你的枚举,你可以做这样的事情:
enum MyType { Type1, Type2, Type3, NumberOfTypes }
NumberOfTypes将评估为3,这是真实类型的数量.
我不相信有.但是,如果这些数字不是连续的,你会用这个数字做什么呢?你还没有在某个地方列出这些数字?如果它们是连续的但是从不同的数字开始,你可以随时做:
enum blah { FIRST = 128, SECOND, THIRD, END }; const int blah_count = END - FIRST;
老问题,我知道.这是针对具有相同问题的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
这对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
编辑:再次阅读文本,我有一个疑问.这是否END
意味着不属于所提供的项目?这对我来说很奇怪,但是,我想这可能有意义......