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?

Était-ce utile?

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
scroll top