Macros C ++: manipuler un paramètre (exemple spécifique)
-
03-07-2019 - |
Question
Je dois remplacer
GET("any_name")
avec
String str_any_name = getFunction("any_name");
La difficulté consiste à supprimer les guillemets. Possible? Des idées?
La solution
Que diriez-vous de:
#define UNSAFE_GET(X) String str_##X = getFunction(#X);
Ou, pour vous protéger contre les problèmes de macro imbriqués:
#define STRINGIFY2(x) #x
#define STRINGIFY(x) STRINGIFY2(x)
#define PASTE2(a, b) a##b
#define PASTE(a, b) PASTE2(a, b)
#define SAFE_GET(X) String PASTE(str_, X) = getFunction(STRINGIFY(X));
Utilisation:
SAFE_GET(foo)
Et voici ce qui est compilé:
String str_foo = getFunction("foo");
Points clés:
- Utilisez ## pour combiner les paramètres de macro dans un seul jeton (jeton =
- Et # pour définir un paramètre de macro (très utile pour effectuer une "réflexion" en C / C ++)
- Utilisez un préfixe pour vos macros, car elles se trouvent toutes dans le même " espace de noms " et vous ne voulez pas de collisions avec un autre code. (J'ai choisi MLV en fonction de votre nom d'utilisateur)
- Les macros wrapper sont utiles si vous imbriquez des macros, c’est-à-dire appelez MLV_GET à partir d’une autre macro avec d’autres paramètres fusionnés / paramétrés (conformément au commentaire ci-dessous, merci!).
Autres conseils
Une approche consiste à ne pas citer le nom lorsque vous appelez la macro:
#include <stdio.h>
#define GET( name ) \
int int##name = getFunction( #name ); \
int getFunction( char * name ) {
printf( "name is %s\n", name );
return 42;
}
int main() {
GET( foobar );
}
En réponse à votre question, non, vous ne pouvez pas "supprimer". les citations en C ++. Mais comme d’autres réponses le démontrent, vous pouvez "les ajouter". Comme vous travaillerez toujours avec un littéral chaîne de toute façon (non?), Vous devriez pouvoir passer à la nouvelle méthode.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow