在C中,是否有一种很好的方法来跟踪枚举中的元素数量?我见过
enum blah {
FIRST,
SECOND,
THIRD,
LAST
};
但这仅在项目是连续的并且从零开始时才有效。
答案 0 :(得分:65)
如果你没有分配你的枚举,你可以做这样的事情:
enum MyType {
Type1,
Type2,
Type3,
NumberOfTypes
}
NumberOfTypes将评估为3,这是真实类型的数量。
答案 1 :(得分:35)
我不相信有。但是,如果这些数字不是连续的,你会用这个数字做什么呢?你还没有在某个地方列出这些数字?如果它们是连续的但是从不同的数字开始,你总是可以这样做:
enum blah {
FIRST = 128,
SECOND,
THIRD,
END
};
const int blah_count = END - FIRST;
答案 2 :(得分:19)
老问题,我知道。这是针对有相同问题的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也是透明的,因此自动完成将正常工作(因为它完全在预处理器中完成)。
答案 3 :(得分:7)
不幸的是,没有。没有。
答案 4 :(得分: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.
任何开发者都知道原因: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
是否意味着不属于所提供的项目?这对我来说看起来很奇怪,但是,我想这可能有意义......
答案 5 :(得分:3)
好吧,因为枚举不能在运行时更改,所以你能做的最好的事情是:
enum blah {
FIRST = 7,
SECOND = 15,
THIRD = 9,
LAST = 12
};
#define blahcount 4 /* counted manually, keep these in sync */
但我发现很难设想这种信息会派上用场的情况。你究竟想做什么?
答案 6 :(得分:3)
int enaumVals[] =
{
FIRST,
SECOND,
THIRD,
LAST
};
#define NUM_ENUMS sizeof(enaumVals) / sizeof ( int );
答案 7 :(得分:0)
#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));
}
答案 8 :(得分:-3)