GCC 4.4.2 C89문자열 표현은
나는 다음과 같은 열거 형이에게 값.
기본적으로 drop_ssm에 0 값을 반환하는 대신 대신 'drop_ssm'을 얻을 수 있습니다.
어떤 조언을 해 주셔서 감사합니다.
GCC 4.4.2 C89문자열 표현은
나는 다음과 같은 열거 형이에게 값.
기본적으로 drop_ssm에 0 값을 반환하는 대신 대신 'drop_ssm'을 얻을 수 있습니다.
어떤 조언을 해 주셔서 감사합니다.
한 가지 방법은 다음과 같이하는 것입니다. 매크로와 Boost.Preprocessor로 매우 흥미로운 것들을 할 수 있지만 꽤 복잡하다. C 언어로 얼마나 잘 작동하는지 확신 할 수 없다. 나는 C++로 일을했습니다. 예를 들면 다음과 같습니다 :
ENUM(
ColorComponent,
(red)
(green)
(blue)
(alpha)
);
// ...
ColorComponent cc = ColorComponent_red;
std::cout << "Color: " << toString(cc) << "\n";
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];
:
가장 좋은 방법은 번역 배열을 만드는 것입니다. 예 :
struct {
enum drop_options_e value;
char *string;
} TranslationArray[] = {
drop_ssm, "drop_ssm",
drop_snm, "drop_snm",
drop_ssb, "drop_ssb",
};
열거 형이 매우 큰 경우 문제가 될 수 있습니다. 당신이 C99의 지정 initialisers을 지원하는 컴파일러가있는 경우
, 당신은 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"
X-Macros가 훨씬 낫다. – qrdl
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);
이것은 좋은 대답 인 것처럼 보인다. 그러나 간단히하기 위해 나는 Naveen 대답을해야 할 것입니다. – ant2009
을 줄 것이다 나는했습니다 그래서 리
이것은'INTEGER'를 출력 할 것입니다, 왜'char * valueTypeStr = "INTEGER"'가 아닌가요? – javapowered
이 열거는 내가 drop_options_s 정적 만드는 데 필요한이 작업을하기 위해 하나 개 이상의 파일에 사용되는 경우, 그리고 매번 열거 파일 :을 시도하는 동안 나는 부스트에서 BOOST_PP_STRINGIZE 매크로 매우 짧고 좋은 뭔가를 발견했습니다 다른 파일에 포함되어 있습니다. drop_options_s가 참조되지 않으면 컴파일하는 동안 경고가 표시됩니다. 모든 컴파일러 경고없이 사용할 수있는 방법이 있습니다. –