Question

Dites que vous voulez 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 vous répéter ni générer automatiquement le code à l'aide de macros C / C ++

Estimation initiale:

Vous pouvez ajouter 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 permet pas de mettre des paramètres dans une chaîne?

Était-ce utile?

La solution

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 une chaîne.

Autres conseils

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);

Ainsi, cette liste de noms peut être réutilisée plusieurs fois. Je l'ai utilisé pour le prototypage de nouvelles fonctionnalités linguistiques, 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" ...:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top