2010-04-20 26 views
3

的typedef枚舉testCaseId { 「TC-HIW-0019」= 0,
「TC-HIW-0020」, 「TC-HIW-0021」
} testCaseId;如何聲明枚舉的字符串用C

我需要我的測試用例在enum中表示。在我的測試功能,我需要像測試用例之間切換:

void testfunc(uint8_t no) 
{ 
    switch(no) 
    { 
     case 0: 
     case 1: 
     default: 
    } 
} 

因此,誰能如何使用枚舉來聲明字符串幫助。

+0

可能重複http://stackoverflow.com/questions/147267/easy-way-to-use-變量 - 的 - 枚舉類型,如串式-C – 2010-04-20 09:15:38

回答

8

實際上,這是無法完成的。您可以有類似下面的效仿:

typedef enum testCaseId { 
    TC_HIW_0019 = 0, 
    TC_HIW_0020, 
    TC_HIW_0021 
} testCaseId; 
char *testCaseDesc[] = { 
    "TC-HIW-0019", 
    "TC-HIW-0020", 
    "TC-HIW-0021" 
}; 

然後,當你想爲描述性的目的,如記錄的字符串值,使用testCaseDesc[x]您使用所有的代碼,並且在枚舉值(x)。

只要確保你的枚舉和數組保持同步。

4

PaxDiablo的解決方案是一個很好的解決方案,儘管幫助保持枚舉和數組同步的好方法是在列表末尾添加一個枚舉值,例如TC_MAX。然後,將數組大小設置爲TC_MAX大小。這樣,如果您添加或刪除枚舉但不更新數組,編譯器會抱怨沒有足夠/太多的初始化程序。

6

添加到Pax的解決方案中,如果您有很多這些東西的列表,如果您使用X-Macros,將事物放在一起並同步可能會更簡單。他們有點ha,,但如果明智地使用它們,他們真的可以爲你節省很多家務。

#define X_TEST_CASE_LIST \ 
    X(TC_HIW_0019, 0, "TC_HIW_0019") \ 
    X(TC_HIW_0020, 1, "TC_HIW_0020") \ 
    X(TC_HIW_0021, 2, "TC_HIW_0021") \ 
    /* ... */ 

#define X(id, val, str) id = val, 
typedef enum testCaseId { 
    X_TEST_CASE_LIST 
} testCaseId; 
#undef X 

#define X(id, val, str) str, 
char *testCaseDesc[] = { 
    X_TEST_CASE_LIST 
}; 
#undef X 

這也可以啓用一些更復雜的映射行爲。例如,你可以很容易地實現線性搜索做一個反向映射從字符串到枚舉值:的

int string_to_enum(const char *in_str) { 
    if (0) 
#define X(id, val, str) else if (0 == strcmp(in_str, str)) return val; 
    X_TEST_CASE_LIST 
#undef X 
    return -1; /* Not found */ 
}