열거형 요소 수
C에서 열거형 요소의 수를 추적할 수 있는 좋은 방법이 있습니까?본 적이 있다
enum blah {
FIRST,
SECOND,
THIRD,
LAST
};
그러나 이것은 항목이 순차적이고 0에서 시작하는 경우에만 작동합니다.
enum을 할당하지 않으면 다음과 같은 작업을 수행할 수 있습니다.
enum MyType {
Type1,
Type2,
Type3,
NumberOfTypes
}
Number Of Types는 실제 유형의 수인 3으로 평가합니다.
있을 것 같지 않아.그러나 이러한 숫자들이 순차적이지 않고 이미 어디에도 목록이 없다면 어떻게 하시겠습니까?또한 순차적이지만 다른 번호에서 시작하는 경우에는 항상 다음을 수행할 수 있습니다.
enum blah {
FIRST = 128,
SECOND,
THIRD,
END
};
const int blah_count = END - FIRST;
오래된 질문이죠, 알아요.이것은 같은 질문을 가진 검색자들을 위한 것이다.
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에도 영향을 주지 않기 때문에, 자동 컴플리트도 정상적으로 동작합니다(프리프로세서로 모두 동작합니다).
불행하게도, 아니다.없다.
매우 오래된 질문인 것은 알지만, 받아들여진 답변이 틀렸기 때문에, 저는 제 자신의 질문을 올려야 할 것 같습니다.승인된 답변의 예를 약간 수정하여 다시 사용하겠습니다. (Enum은 순차적이라고 가정합니다.)
// 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
제공 품목에 포함되지 않는 것을 의미합니까?이상하게 보이긴 하지만 말이 되네
#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));
}
int enaumVals[] =
{
FIRST,
SECOND,
THIRD,
LAST
};
#define NUM_ENUMS sizeof(enaumVals) / sizeof ( int );
실행 시 Enum을 변경할 수 없기 때문에 가장 좋은 방법은 다음과 같습니다.
enum blah {
FIRST = 7,
SECOND = 15,
THIRD = 9,
LAST = 12
};
#define blahcount 4 /* counted manually, keep these in sync */
그러나 나는 그 정보가 유용한 상황을 상상하는 것이 어렵다는 것을 알았다.정확히 뭘 하려는 거죠?
언급URL : https://stackoverflow.com/questions/712463/number-of-elements-in-an-enum
'programing' 카테고리의 다른 글
Webpacker의 vuex 돌연변이 테스트에서 vue.esm.js를 가져올 수 없습니다. (0) | 2022.07.12 |
---|---|
sessionStorage에서 Vuex 상태를 유지해도 안전합니까? (0) | 2022.07.12 |
C 프로그램에서 X코드로 명령줄 인수 제공 (0) | 2022.07.12 |
어떻게 자바에 천을 똑같이 복사해야 한다고? (0) | 2022.07.12 |
비트 필드에 값을 할당해도 동일한 값이 반환되지 않는 이유는 무엇입니까? (0) | 2022.07.12 |