Faire quelque chose à la fois d’un identifiant C et d’une chaîne?

Supposons que vous souhaitiez générer une liste correspondante d’identifiants et de chaînes

enum { NAME_ONE, NAME_TWO, NAME_THREE }; myFunction(NAME_ONE, "NAME_ONE"); myFunction(NAME_TWO, "NAME_TWO"); myFunction(NAME_THREE, "NAME_THREE"); 

..sans répéter, et sans générer automatiquement le code, en utilisant des macros C / C ++

Estimation initiale:

Vous pouvez append un fichier #include contenant

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

Puis utilisez-le deux fois comme:

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

mais #define ne vous laisse pas mettre de parameters dans une chaîne?

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

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

    Cela convertit l’argument en chaîne.

    Voici un bon moyen de déclarer une 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, cette liste de noms peut être réutilisée plusieurs fois. Je l’ai utilisé pour prototyper de nouvelles fonctionnalités de langage, bien que je n’ai jamais fini de les utiliser. Donc, si rien d’autre, c’est un excellent moyen de trouver des impasses dans ses propres inventions. Je me demande si c’est parce qu’ils disent: “les macros sont mauvaises” … 🙂