如何在 C 中声明枚举中的字符串

发布于 2024-08-29 11:38:44 字数 344 浏览 4 评论 0 原文

typedef 枚举 testCaseId { “TC-HIW-0019”= 0,
“TC-HIW-0020”, “TC-HIW-0021”
} 测试用例 ID;

我需要我的测试用例以枚举形式表示。在我的测试函数中,我需要在测试用例之间切换,例如:

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

那么任何人都可以帮助了解如何使用枚举来声明字符串。

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

I need my test cases to be represented in enum. In my test function, I need to switch between the test cases like:

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

So can anyone help on how to use enum to declare strings.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

櫻之舞 2024-09-05 11:38:44

事实上,这是不可能的。您可以使用类似以下内容来模拟它:

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

只需确保枚举和数组保持同步即可。

Actually, that can't be done. You can emulate it with something like the following:

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"
};

Then you use the enumerated values (x) for all your code and, when you want the string value for descriptive purposes such as logging, use testCaseDesc[x].

Just make sure you keep your enumeration and array synchronised.

眼睛会笑 2024-09-05 11:38:44

添加到 Pax 的解决方案中,如果您有一个非常大的这些内容列表,那么如果您使用 X 宏。它们有点笨拙,但是如果使用得当,它们确实可以为您节省大量的家务活。

#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 */
}

Adding to Pax's solution, if you have a very large list of these things, it may be simpler to keep things together and synchronized if you use X-Macros. They're a bit hackish, but when used judiciously, they can really save you a lot of housekeeping.

#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

This can also enable some more complicated mapping behaviors. For example, you can easily implement a linear search to do a reverse mapping from string to enum value:

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 */
}
自控 2024-09-05 11:38:44

PaxDiablo 的解决方案是一个很好的解决方案,尽管帮助保持枚举和数组同步的一个好方法是在列表末尾添加一个枚举值,例如 TC_MAX。然后将数组大小设置为 TC_MAX 大小。这样,如果您添加或删除枚举但不更新数组,编译器会抱怨没有足够/太多的初始化程序。

PaxDiablo's solution is a good one, though a good way to help keep your enums and arrays synchronised is to add an enum value at the end of the list such as TC_MAX. Then you set the array size to be TC_MAX in size. This way if you add or remove an enum but don't update the array the compiler will complain that there aren't enough/too many initialisers.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文