Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Récupération du nom d'une variable

6 réponses
Avatar
none
Bonjour, Dans le cadre d'une petite classe de gestion de traces,
j'essaie de récupérer le nom d'une variable via une macro (je ne sais
pas si c'est possible). Jusqu'ici, je passais 2 arguments à une macro :


Exemple simple avec un "cout" :

#define TRACE(nom,valeur) std::cout << nom << " = " << valeur << std:endl;

Appel :

int i = 3;
TRACE("i",i)

Seulement, je trouve que d'écrire 2 fois la même chose dans les
paramètres de TRACE, ce n'est pas très pratique, et donc j'essaie de
faire ça en un seul argument :

*Premier essais :

#define TRACE(variable) std::cout << "variable" << " = " << variable <<
std:endl;

Mais le compilateur considère que "variable" est une chaîne

*Deuxième essais :

#define TRACE(variable) std::cout << \"variable\" << " = " << variable
<< std:endl;

Ca ne compile pas!


Je ne suis pas sûr d'avoir été très clair, mais si quelqu'un a compris
ce que je cherchais à faire, et surtout s'il sait comment le faire, je
veux bien qu'il m'explique :)

Cyrille

6 réponses

Avatar
Serge Paccalin
Le samedi 4 août 2007 à 17:38:16, none a écrit dans fr.comp.lang.c++ :

Jusqu'ici, je passais 2 arguments à une macro :

Exemple simple avec un "cout" :

#define TRACE(nom,valeur) std::cout << nom << " = " << valeur << std:endl;

Appel :

int i = 3;
TRACE("i",i)

Seulement, je trouve que d'écrire 2 fois la même chose dans les
paramètres de TRACE, ce n'est pas très pratique, et donc j'essaie de
faire ça en un seul argument :


#define TRACE(variable)
std::cout << #variable << " = " << variable << std::endl;

--
___________
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763

Avatar
Falk Tannhäuser
none schrieb:
*Premier essais :

#define TRACE(variable) std::cout << "variable" << " = " << variable <<
std:endl;

Mais le compilateur considère que "variable" est une chaîne


#define TRACE(x) std::cout << #x " = " << (x) << std:endl;

Falk

Avatar
none
Il suffit donc de mettre un # devant, merci Falk Tannhäuser et Serge
Paccalin pour vos réponses simultanées :)
Avatar
Loïc Joly
Il suffit donc de mettre un # devant, merci Falk Tannhäuser et Serge
Paccalin pour vos réponses simultanées :)


A noter que dans certains cas un peu plus complexes, le # n'est pas
sufisant. Si tu tombes dans ces cas, je te conseilles de regarder du
côté de http://www.boost.org/libs/preprocessor/doc/ref/stringize.html

--
Loïc

Avatar
none
Il suffit donc de mettre un # devant, merci Falk Tannhäuser et Serge
Paccalin pour vos réponses simultanées :)


A noter que dans certains cas un peu plus complexes, le # n'est pas
sufisant. Si tu tombes dans ces cas, je te conseilles de regarder du
côté de http://www.boost.org/libs/preprocessor/doc/ref/stringize.html



Merci, ça tombe bien, ça pourrait m'être utile!


Avatar
Cedric Roux
Loïc Joly wrote:
Il suffit donc de mettre un # devant, merci Falk Tannhäuser et Serge
Paccalin pour vos réponses simultanées :)


A noter que dans certains cas un peu plus complexes, le # n'est pas
sufisant. Si tu tombes dans ces cas, je te conseilles de regarder du
côté de http://www.boost.org/libs/preprocessor/doc/ref/stringize.html



simplement:
#define STRINGIZE(s) STRINGIZE2(s)
#define STRINGIZE2(s) #s

sur l'exemple:
#define ALL_TESTS
INIT_TEST("string one", 1)
DEF_TEST("string two", 2)

STRINGIZE(ALL_TESTS)
STRINGIZE2(ALL_TESTS)

donne:
"INIT_TEST("string one", 1) DEF_TEST("string two", 2)"
"ALL_TESTS"

(merci c.l.c. :))