如何在C中声明枚举中的字符串
typedef枚举testCaseId { “TC-HIW-0019”=0,如何在C中声明枚举中的字符串,c,string,enums,C,String,Enums,typedef枚举testCaseId { “TC-HIW-0019”=0, “TC-HIW-0020”, “TC-HIW-0021” }testCaseId 我需要在enum中表示我的测试用例。在我的测试函数中,我需要在测试用例之间切换,如: void testfunc(uint8_t no) { switch(no) { case 0: case 1: default: } } 因此,任何人都可以在如何使用enum
“TC-HIW-0020”, “TC-HIW-0021”
}testCaseId 我需要在enum中表示我的测试用例。在我的测试函数中,我需要在测试用例之间切换,如:
void testfunc(uint8_t no)
{
switch(no)
{
case 0:
case 1:
default:
}
}
因此,任何人都可以在如何使用enum声明字符串方面提供帮助。实际上,这是做不到的。您可以使用以下内容来模拟它:
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"
};
然后将枚举值(x
)用于所有代码,如果希望字符串值用于日志记录等描述性目的,请使用testCaseDesc[x]
只需确保枚举和数组保持同步。PaxDiablo的解决方案是一个很好的解决方案,不过帮助保持枚举和数组同步的一个好方法是在列表末尾添加一个枚举值,如TC_MAX。然后将数组大小设置为TC_MAX。这样,如果您添加或删除枚举,但不更新数组,编译器会抱怨初始化器不够/太多。添加到Pax的解决方案中,如果您有一个非常大的列表,那么如果您使用它,将这些东西放在一起并同步可能会更简单。它们有点粗俗,但如果使用得当,它们确实可以为您节省大量家务
#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 */
}
可能重复的