Récupération du nom d'une variable

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Serge Paccalin
Le #310261
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

Falk Tannhäuser
Le #310260
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

none
Le #310259
Il suffit donc de mettre un # devant, merci Falk Tannhäuser et Serge
Paccalin pour vos réponses simultanées :)
Loïc Joly
Le #310236
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

none
Le #310235
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!


Cedric Roux
Le #310531
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. :))


Publicité
Poster une réponse
Anonyme