如何在C语言中枚举枚举中的字符串

Sri*_*evi 3 c string enums

typedef enum testCaseId {"TC-HIW-0019"= 0,
"TC-HIW-0020","TC-HIW-0021"
} testCaseId;

我需要在枚举中表示我的测试用例.在我的测试功能中,我需要在测试用例之间切换,如:

void testfunc(uint8_t no)
{  
    switch(no)
    {
        case 0:
        case 1:
        default:
    }
}
Run Code Online (Sandbox Code Playgroud)

所以任何人都可以帮助如何使用枚举来声明字符串.

pax*_*blo 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"
};
Run Code Online (Sandbox Code Playgroud)

然后x对所有代码使用枚举值(),当您希望字符串值用于描述目的时,例如日志记录,请使用testCaseDesc[x].

只需确保您的枚举和数组保持同步.


Mat*_* B. 6

添加到Pax的解决方案,如果你有一个非常大的这些东西列表,如果你使用X-Macros,可以更简单地保持在一起并同步.他们有点hackish,但明智地使用,他们可以真正为你节省大量的时间.

#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
Run Code Online (Sandbox Code Playgroud)

这也可以实现一些更复杂的映射行为.例如,您可以轻松实现线性搜索,以执行从字符串到枚举值的反向映射:

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 */
}
Run Code Online (Sandbox Code Playgroud)