Как объявить строки в enum в C - PullRequest
3 голосов
/ 20 апреля 2010

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

Мне нужно, чтобы мои тестовые примеры были представлены в enum. В моей тестовой функции мне нужно переключаться между тестовыми примерами, такими как:

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

Так может кто-нибудь помочь с тем, как использовать enum для объявления строк.

Ответы [ 3 ]

8 голосов
/ 20 апреля 2010

На самом деле, это не может быть сделано. Вы можете эмулировать что-то вроде следующего:

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

Просто убедитесь, что вы перечислили и перечислили массив.

6 голосов
/ 20 апреля 2010

В дополнение к решению Pax, если у вас есть очень большой список этих вещей, может быть проще хранить вещи вместе и синхронизировать, если вы используете X-Macros . Они немного хакерские, но при разумном использовании они действительно могут сэкономить вам много домашнего хозяйства.

#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

Это также может включить некоторые более сложные способы отображения. Например, вы можете легко реализовать линейный поиск, чтобы выполнить обратное отображение строки в значение enum:

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 */
}
4 голосов
/ 20 апреля 2010

Решение PaxDiablo - хорошее решение, хотя хороший способ помочь синхронизировать ваши перечисления и массивы - это добавить значение перечисления в конец списка, например TC_MAX. Затем вы устанавливаете размер массива равным TC_MAX. Таким образом, если вы добавляете или удаляете enum, но не обновляете массив, компилятор будет жаловаться на то, что инициализаторов недостаточно / слишком много.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...