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)
所以任何人都可以帮助如何使用枚举来声明字符串.
实际上,这是不可能完成的.您可以使用以下内容模拟它:
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].
只需确保您的枚举和数组保持同步.
添加到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)