2008-09-24 4 views
14

que vous voulez générer une liste correspondante des identifiants et des chaînesFaire quelque chose à la fois un identifiant C et une chaîne?

enum 
{ 
NAME_ONE, 
NAME_TWO, 
NAME_THREE 
}; 

myFunction(NAME_ONE, "NAME_ONE"); 
myFunction(NAME_TWO, "NAME_TWO"); 
myFunction(NAME_THREE, "NAME_THREE"); 

..without vous répéter, et sans création automatique du code, en utilisant des macros C/C++

estimation initiale:

Vous pouvez ajouter un fichier contenant #include

myDefine(NAME_ONE) 
myDefine(NAME_TWO) 
myDefine(NAME_THREE) 

Ensuite, utilisez deux fois:

#define myDefine(a) a, 
enum { 
#include "definitions" 
} 
#undef myDefine 

#define myDefine(a) myFunc(a, "a"); 
#include "definitions" 
#undef myDefine 

mais #define ne vous permet pas de mettre des paramètres dans une chaîne?

Répondre

24

Pour votre deuxième #define, vous devez utiliser l'opérateur # préprocesseur, comme ceci:

#define myDefine(a) myFunc(a, #a); 

qui convertit l'argument en une chaîne.

3

est ici une bonne façon de déclarer liste de noms:

#define FOR_ALL_FUNCTIONS(F)\ 
    F(NameOne)\ 
    F(NameTwo)\ 
    F(NameThree)\ 

#define DECLARE_FUNCTION(N)\ 
    void N(); 

#define IMPLEMENT_FUNCTION(N)\ 
    void N(){} 

FOR_ALL_FUNCTIONS(DECLARE_FUNCTION); 
FOR_ALL_FUNCTIONS(IMPLEMENT_FUNCTION); 

De cette façon, ce nom-liste peut être réutilisé plusieurs fois. Je l'ai utilisé pour le prototypage de nouvelles fonctionnalités de langue, mais je n'ai jamais fini par les utiliser. Donc, si rien d'autre, ils étaient un excellent moyen de trouver des impasses dans ses propres inventions. Je me demande si c'est parce que ce qu'ils disent: "les macros sont mauvaises" ... :)

+1

Génial de voir quelqu'un d'autre utiliser le nom de la macro qui passe aussi. Je trouve cette technique très puissante et utile. Plug sans vergogne: http://stackoverflow.com/questions/147267/easy-way-to-use-variables-of-enum-types-as-string-in-c#202511 – Suma

Questions connexes