2010-03-30 10 views
4

gcc 4.4.2 C89représentation de chaîne de valeurs ENUM

Je l'ENUM suivante:

enum drop_options_e 
{ 
    drop_ssm, 
    drop_snm, 
    drop_ssb 
}; 

Je me demande c'est la meilleure façon d'obtenir la valeur de représentation de chaîne de la ENUM. Donc, au lieu de retourner la valeur de 0 pour drop_ssm, je pourrais obtenir le 'drop_ssm' à la place.

Un grand merci pour tous les conseils,

Répondre

10

Une façon est de faire comme ceci:

enum drop_options_e 
{ 
    drop_ssm = 0, 
    drop_snm , 
    drop_ssb , 
    LAST_ENTRY /* Should be last entry */ 
}; 

const char* drop_options_s[LAST_ENTRY] = {"drop_ssm", "drop_snm", "drop_ssb"}; 

quand vous voulez une représentation de chaîne d'un ENUM vous pouvez drop_options_s[enum];

+1

si ce ENUM est utilisé dans plus d'un fichier, pour faire ce travail que je devais faire drop_options_s statique, et chaque fichier ENUM est inclus dans un autre fichier, si drop_options_s n'est pas référencé, j'obtiens un avertissement lors de la compilation, est-il possible de l'utiliser sans tous les avertissements du compilateur? –

3

C n'a pas de soutien pour cela. Vous devrez avoir un commutateur ou un équivalent quelque part.

2

Il n'y a rien hors de la boîte. Vous pouvez faire des choses très intéressantes avec les macros et Boost.Preprocessor, mais c'est très impliqué, et je ne suis pas sûr que ça marcherait bien en C; J'ai fait des choses en C++ qui me permettent d'écrire, par exemple .:

ENUM(
    ColorComponent, 
    (red) 
    (green) 
    (blue) 
    (alpha) 
    ); 
// ... 
ColorComponent cc = ColorComponent_red; 
std::cout << "Color: " << toString(cc) << "\n"; 
2

La meilleure façon de faire voir de gérer cela est de créer un tableau de traduction. Quelque chose comme:

struct { 
    enum drop_options_e value; 
    char *string; 
} TranslationArray[] = { 
    drop_ssm, "drop_ssm", 
    drop_snm, "drop_snm", 
    drop_ssb, "drop_ssb", 
}; 

Cela peut être problématique si vous êtes enum est assez grand.

3

Si vous avez un compilateur qui prend en charge les initialiseurs désignés de C99, vous pouvez améliorer Naveen's answer:

enum drop_options_e 
{ 
    drop_ssm, 
    drop_snm, 
    drop_ssb 
}; 

#define ENUM_TO_S(e) [e] = #e 

const char *drop_options_s[] = { 
    ENUM_TO_S(drop_ssm), 
    ENUM_TO_S(drop_snm), 
    ENUM_TO_S(drop_ssb) 
}; 

(Avec cette méthode, vous n'avez pas à vous soucier du tableau initialiseurs étant dans le même ordre que les valeurs enum).

+0

C'est tellement mieux avec X-Macros – qrdl

4

En utilisant X-Macro technique:

fichier items:

ITEM(drop_ssm) 
ITEM(drop_snm) 
ITEM(drop_ssb) 

source:

#define ITEM(A) A, 
enum drop_options_e 
{ 
#include "items" 
last 
}; 
#undef ITEMS 
#define ITEM(A) #A, 
char item_names[] = { 
#include "items" 
NULL}; 

Alors maintenant item_names[drop_ssm] vous donnera chaîne de texte "drop_ssm"

+0

Cela ressemble à une bonne réponse. Cependant, pour plus de simplicité, je vais devoir répondre à Naveen. – ant2009

-1

J'ai donc li ked toutes les réponses ici! Pendant les essayer, je l'ai trouvé quelque chose de très court et agréable avec macro BOOST_PP_STRINGIZE de boost:

//Define the enum you need 
typedef enum 
{ 
INTEGER = 0, 
STRING = 1, 
BOOLEAN = 2, 
}eValueType; 

// Then in code use BOOST_PP_STRINGIZE, for example: 
char* valueTypeStr = BOOST_PP_STRINGIZE(INTEGER); 
+0

cela va imprimer 'INTEGER', pourquoi pas simplement' char * valueTypeStr = "INTEGER" '? – javapowered

Questions connexes