Comment utiliser l'argument Macro comme littéral de chaîne?

91

J'essaie de comprendre comment écrire une macro qui passera à la fois une représentation littérale de chaîne d'un nom de variable avec la variable elle-même dans une fonction.

Par exemple étant donné la fonction suivante.

void do_something(string name, int val)
{
   cout << name << ": " << val << endl;
}

Je voudrais écrire une macro pour pouvoir le faire:

int my_val = 5;
CALL_DO_SOMETHING(my_val);

Ce qui imprimerait: my_val: 5

J'ai essayé de faire ce qui suit:

#define CALL_DO_SOMETHING(VAR) do_something("VAR", VAR);

Cependant, comme vous pouvez le deviner, le VAR à l'intérieur des guillemets n'est pas remplacé, mais est simplement passé en tant que chaîne littérale "VAR". Je voudrais donc savoir s'il existe un moyen de transformer l'argument macro en une chaîne littérale elle-même.

Ian
la source
Comment essayez-vous d'utiliser cela?
chris

Réponses:

145

Utilisez l' #opérateur de préprocesseur :

#define CALL_DO_SOMETHING(VAR) do_something(#VAR, VAR);
Morwenn
la source
28

Vous souhaitez utiliser l'opérateur de stringizing:

#define STRING(s) #s

int main()
{
    const char * cstr = STRING(abc); //cstr == "abc"
}
Chris
la source
9

Peut-être que vous essayez cette solution:

#define QUANTIDISCHI 6
#define QUDI(x) #x
#define QUdi(x) QUDI(x)
. . . 
. . .
unsigned char TheNumber[] = "QUANTIDISCHI = " QUdi(QUANTIDISCHI) "\n";
Zili
la source
Comment cela répond-il à la question ou en quoi est-ce utile?
jirigracik
1
@jirigracik - Il permet également d'obtenir une présentation sous forme de chaîne de l'extension de macro, contrairement à d'autres réponses
grepcake
3
Je pense qu'il serait utile d'expliquer pourquoi l'avoir QUDI(x)ne suffit pas.
LRDPRDX
8
#define NAME(x) printf("Hello " #x);
main(){
    NAME(Ian)
}
//will print: Hello Ian
Mikele Shtembari
la source
Je ne suis pas tout à fait sûr, mais il semble que "Hello" #x"(et #x "Hello") provoque le collage de la chaîne sans espace, ce qui est souhaité dans certains cas, donc c'est une assez bonne réponse.
Smar
1
@Smar Assurez-vous de mettre un espace après la chaîne constante Bonjour: "Hello " #x
jack
D'accord, je pensais que oui, vous devriez également modifier cela dans votre réponse car c'est une information précieuse :)
Smar