2010-04-20 5 views
3

typedef enum testCaseId { "TC-HIW-0019" = 0,
"TC-HIW-0020", "TC-HIW-0021"
} testCaseId;Comment déclarer les chaînes dans ENUM en C

J'ai besoin que mes cas de test soient représentés dans enum. Dans ma fonction de test, je dois passer entre les cas de test comme:

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

Alors quelqu'un peut-il aider sur la façon d'utiliser ENUM pour déclarer des chaînes.

+0

double possible de http://stackoverflow.com/questions/147267/easy-way-to-use- variables-de-enum-types-comme-chaîne-en-c –

Répondre

8

En fait, cela ne peut pas être fait. Vous pouvez l'imiter avec quelque chose comme ce qui suit:

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

Ensuite, vous utilisez les valeurs énumérées (x) pour tout votre code et, quand vous voulez la valeur de chaîne à des fins descriptives telles que l'exploitation forestière, l'utilisation testCaseDesc[x].

Assurez-vous de garder votre énumération et votre tableau synchronisés.

4

La solution de PaxDiablo est une bonne solution, même si un bon moyen de synchroniser vos énumérateurs et tableaux consiste à ajouter une valeur enum à la fin de la liste, par exemple TC_MAX. Ensuite, vous définissez la taille du tableau à TC_MAX en taille. De cette façon, si vous ajoutez ou supprimez une énumération sans mettre à jour le tableau, le compilateur se plaindra qu'il n'y a pas assez d'initialiseurs.

6

Ajout à la solution de Pax, si vous avez une très grande liste de ces choses, il peut être plus simple de garder les choses ensemble et synchronisées si vous utilisez X-Macros. Ils sont un peu hackish, mais lorsqu'ils sont utilisés judicieusement, ils peuvent vraiment vous faire économiser beaucoup d'entretien ménager.

#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 

Cela peut également activer certains comportements de mappage plus compliqués. Par exemple, vous pouvez facilement mettre en œuvre une recherche linéaire pour faire une correspondance inverse de chaîne à valeur 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 */ 
}