web-dev-qa-db-fra.com

Comment utiliser l'argument Macro comme littéral?

J'essaie de comprendre comment écrire une macro qui transmettra à la fois une représentation littérale de chaîne d'un nom de variable et 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 faire ceci:

int my_val = 5;
CALL_DO_SOMETHING(my_val);

Ce qui afficherait: 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é, il est simplement transmis en tant que littéral de chaîne "VAR". Je voudrais donc savoir s’il est possible de transformer l’argument de macro en littéral de chaîne lui-même.

71
Ian

Utilisez le préprocesseur # opérateur :

#define CALL_DO_SOMETHING(VAR) do_something(#VAR, VAR);
115
Morwenn

Vous voulez utiliser l'opérateur stringizing:

#define STRING(s) #s

int main()
{
    const char * cstr = STRING(abc); //cstr == "abc"
}
23
chris
#define NAME(x) printf("Hello " #x);
main(){
    NAME(Ian)
}
//will print: Hello Ian
7
Mikele Shtembari

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";
3
Zili