109 votes

Comment utiliser un argument de macro en tant que chaîne de caractères littérale ?

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

Par exemple, compte tenu de 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);

Qui s'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 transmis en tant que chaîne littérale "VAR". J'aimerais donc savoir s'il existe un moyen de transformer l'argument de la macro en une chaîne de caractères littérale.

181voto

Morwenn Points 4071

Utiliser le préprocesseur # opérateur :

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

43voto

chris Points 28950

Vous souhaitez utiliser l'opérateur de chaînage :

#define STRING(s) #s

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

15voto

Zili Points 147

Vous pouvez peut-être essayer cette solution :

#define QUANTIDISCHI 6
#define QUDI(x) #x
#define QUdi(x) QUDI(x)
. . . 
. . .
unsigned char TheNumber[] = "QUANTIDISCHI = " QUdi(QUANTIDISCHI) "\n";

14voto

Mikele Shtembari Points 143
#define NAME(x) printf("Hello " #x);
main(){
    NAME(Ian)
}
//will print: Hello Ian

0voto

#define THE_LITERAL abcd

#define VALUE(string) #string
#define TO_LITERAL(string) VALUE(string)

std::string abcd = TO_LITERAL(THE_LITERAL); // generates abcd = "abcd"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X