2010-03-30 3 views
4

GCC 4.4.2 C89문자열 표현은

나는 다음과 같은 열거 형이에게 값.

기본적으로 drop_ssm에 0 값을 반환하는 대신 대신 'drop_ssm'을 얻을 수 있습니다.

어떤 조언을 해 주셔서 감사합니다.

답변

10

한 가지 방법은 다음과 같이하는 것입니다. 매크로와 Boost.Preprocessor로 매우 흥미로운 것들을 할 수 있지만 꽤 복잡하다. C 언어로 얼마나 잘 작동하는지 확신 할 수 없다. 나는 C++로 일을했습니다. 예를 들면 다음과 같습니다 :

ENUM(
    ColorComponent, 
    (red) 
    (green) 
    (blue) 
    (alpha) 
    ); 
// ... 
ColorComponent cc = ColorComponent_red; 
std::cout << "Color: " << toString(cc) << "\n"; 
+1

이 열거는 내가 drop_options_s 정적 만드는 데 필요한이 작업을하기 위해 하나 개 이상의 파일에 사용되는 경우, 그리고 매번 열거 파일 :을 시도하는 동안 나는 부스트에서 BOOST_PP_STRINGIZE 매크로 매우 짧고 좋은 뭔가를 발견했습니다 다른 파일에 포함되어 있습니다. drop_options_s가 참조되지 않으면 컴파일하는 동안 경고가 표시됩니다. 모든 컴파일러 경고없이 사용할 수있는 방법이 있습니다. –

3

C는이를 지원하지 않습니다. 당신은 어딘가에 스위치 또는 동등 물을 가져야합니다. 당신이 열거의 캐릭터 라인 표현을 할 때

enum drop_options_e 
{ 
    drop_ssm = 0, 
    drop_snm , 
    drop_ssb , 
    LAST_ENTRY /* Should be last entry */ 
}; 

const char* drop_options_s[LAST_ENTRY] = {"drop_ssm", "drop_snm", "drop_ssb"}; 

할 수 있습니다 상자 밖으로 거기에 아무것도 drop_options_s[enum];

2

:

2

가장 좋은 방법은 번역 배열을 만드는 것입니다. 예 :

struct { 
    enum drop_options_e value; 
    char *string; 
} TranslationArray[] = { 
    drop_ssm, "drop_ssm", 
    drop_snm, "drop_snm", 
    drop_ssb, "drop_ssb", 
}; 

열거 형이 매우 큰 경우 문제가 될 수 있습니다. 당신이 C99의 지정 initialisers을 지원하는 컴파일러가있는 경우

3

, 당신은 Naveen's answer을 개선 할 수 있습니다

enum drop_options_e 
{ 
    drop_ssm, 
    drop_snm, 
    drop_ssb 
}; 

#define ENUM_TO_S(e) [e] = #e 

const char *drop_options_s[] = { 
    ENUM_TO_S(drop_ssm), 
    ENUM_TO_S(drop_snm), 
    ENUM_TO_S(drop_ssb) 
}; 

(이 방법을 사용하면 배열의 initialisers 같은 순서로 것에 대해 걱정할 필요가 없습니다 enum 값).

파일 items :

ITEM(drop_ssm) 
ITEM(drop_snm) 
ITEM(drop_ssb) 

소스 :

#define ITEM(A) A, 
enum drop_options_e 
{ 
#include "items" 
last 
}; 
#undef ITEMS 
#define ITEM(A) #A, 
char item_names[] = { 
#include "items" 
NULL}; 

는 이제 item_names[drop_ssm]하면 텍스트 문자열 "drop_ssm"

+0

X-Macros가 훨씬 낫다. – qrdl

4

X-Macro 기술을 사용하여 여기 모든 대답을 ked해라!

//Define the enum you need 
typedef enum 
{ 
INTEGER = 0, 
STRING = 1, 
BOOLEAN = 2, 
}eValueType; 

// Then in code use BOOST_PP_STRINGIZE, for example: 
char* valueTypeStr = BOOST_PP_STRINGIZE(INTEGER); 
+0

이것은 좋은 대답 인 것처럼 보인다. 그러나 간단히하기 위해 나는 Naveen 대답을해야 할 것입니다. – ant2009

-1

을 줄 것이다 나는했습니다 그래서 리

+0

이것은'INTEGER'를 출력 할 것입니다, 왜'char * valueTypeStr = "INTEGER"'가 아닌가요? – javapowered

관련 문제