Faire quelque chose à la fois d'un identifiant C et d'une chaîne?
-
02-07-2019 - |
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?
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" ...:)