enum의 값들을 스트링으로 보려면?
글쓴이: khiny / 작성시간: 금, 2007/09/21 - 2:39오후
#include <stdio.h>
typedef enum{
red,
green,
black
} color;
int main(void) {
color box = green;
printf("%d\n",box);
return 0;
}위의 코드를 컴파일해서 실행해보면 1 이 찍힙니다.
근데 1이 아니라 green이라는 값이 찍히도록 하려면 어찌해야 할까요?
color가 정의된 부분을 통짜로 복사해서 적절한 함수를 하나 만든다면?
void print_color(color input){
switch(input){
case red : printf("red"); break;
case green : printf("green"); break;
case black : printf("black"); break;
default : break;
}
}이런식으로 말이죠.
근데 여기서는 3개의 값밖에 없지만, 저게 1000이상이 되고
중간에 #ifdef 등의 전처리가 들어간다면 print_color함수만드는 일이
꽤 어려워질것 같습니다.(전처리야 머 그대로 해주면 상관없을듯하지만)
저와같이 이런 비슷한 고민을 해 본 분이 있을것 같은데
다른 좋은 방법이 있는지 궁금합니다.
Forums:


..
구글링을 해보니 다음과 같은걸 발견했습니당.
http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht20Ht/c_preprocessor_applications_en
아이디어가 좋네요.
윗분이 찾아낸거 보니깐 괜찮은 아이디어네요.
하지만 제가 가지고 있는 enum은 이미 천개가 넘는 양이라서,
저걸 다시 적용시켜서 변환할 생각을 하니...ㅡ.ㅡ;
코딩량을 최소한으로 변환시킬 방법을 생각해야겠네요.
치환을 잘 이용해서...해야할듯하네요.
typedef
typedef enum{ red, green, black, ...1000여개의 색깔 } color;이 코드를 이렇게 고치려했습니다.
#include <stdio.h> #define COLOR \ C(RED)\ C(GREEN)\ C(BLUE)\ ...1000여개의 색깔 #define C(x) x, enum color { COLOR }; #undef C #define C(x) #x, const char * const color_name[] = { COLOR };그런데 중간에 전처리가 또 들어가면 대략 낭패가
함수로 만들어야하는건가요?
C++이라면
C++이라면
이렇게 할 수도 있읍니다.
std::vector<const char*> color_name; namespace DUMMY____ { inline int next_index() { static int index = 0; return index++; } struct color__ { color__(const char* cn) { color_name.push_back(cn); } }; } #define COLOR( x ) \ const int x = DUMMY____::next_index(); \ namespace DUMMY____ { color__ DUMMY##x(#x); } COLOR( red ) COLOR( green ) // ... int main() { cout << red << color_name[red] << endl; cout << green << color_name[green] << endl; return 0; }생각해보니까
이대로라면 헤더에 넣고 쓰기에는 부적절하군요...
___________________________________
Less is More (Robert Browning)
___________________________________
Less is More (Robert Browning)
댓글 달기