2010-03-30 85 views
4

GCC 4.4.2的C89字符串表示值

我有以下枚舉:

enum drop_options_e 
{ 
    drop_ssm, 
    drop_snm, 
    drop_ssb 
}; 

我只是想知道這是獲得從枚舉的字符串表示值的最佳方式。

所以基本上,而不是返回drop_ssm 0的值,而是我可以得到'drop_ssm'。

非常感謝您的任何建議,

回答

10

一種方法是這樣做:

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];

+1

,使這項工作,我需要做drop_options_s靜態的,每次枚舉文件被包含在另一個文件中,如果drop_options_s沒有被引用,編譯時會得到一個警告,有沒有一種方法可以在沒有所有編譯器警告的情況下使用它。 – 2013-06-06 11:11:40

3

C不支持。你將不得不在某個地方有一個交換機或等價物。

2

沒有什麼現成的。你可以用宏和Boost.Preprocessor做一些非常有趣的事情,但是它非常重要,我不確定它在C中的工作效果如何;我已經做了在C++中,讓我寫,例如:

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

我看到處理這是創建一個翻譯陣列的最好辦法的事情。例如:

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

如果您的枚舉非常大,這可能會有問題。

3

如果您有支持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以相同的順序爲枚舉值)。

+0

用X-Macros更好用 – qrdl 2010-03-30 07:34:57

4

使用X-Macro技術:

文件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

這看起來很不錯。但是,爲了簡單起見,我將不得不爲Naveen回答。 – ant2009 2010-03-30 07:40:51

-1

我已經所以li ked所有的答案在這裏!在審判他們,我發現了一些從升壓很短,漂亮與BOOST_PP_STRINGIZE宏:如果該枚舉在多個文件中使用

//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

這將打印'INTEGER',爲什麼不只是'char * valueTypeStr =「INTEGER」'? – javapowered 2014-04-25 13:57:56