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

[HS?] #define

2 réponses
Avatar
Guillaume Gourdin
Bonjour, je suis allé farffouiller dans Afx.h pour voir la definition de la
macro TRACE (qui permet d'afficher du texte dans le debugger de Visual), et
je suis tombé sur ça (en version release, en debug, TRACE est juste remplacé
par ::AfxTrace) :

#define TRACE 1 ? (void)0 : ::AfxTrace

Est-ce que quelqu'un pourrait m'expliquer à quoi sert cette macro ?
J'imagine qu'elle sert à ne pas appeler la fonction AfxTrace qui est
j'imagine toujours la fonction Win32 qui affiche le texte dans le
debugger... Mais le reste est assez obscur pour moi... A quoi sert le
(void)0 ? Et pourquoi faire le test ternaire qui revoit toujours vrai ?

Merci de vos lumières !

2 réponses

Avatar
kanze
"Guillaume Gourdin" wrote in message
news:<c7fm0a$als$...

Bonjour, je suis allé farffouiller dans Afx.h pour voir la definition
de la macro TRACE (qui permet d'afficher du texte dans le debugger de
Visual), et je suis tombé sur ça (en version release, en debug, TRACE
est juste remplacé par ::AfxTrace) :

#define TRACE 1 ? (void)0 : ::AfxTrace

Est-ce que quelqu'un pourrait m'expliquer à quoi sert cette macro ?


Introduire des erreurs subtiles de syntax :-).

J'imagine qu'elle sert à ne pas appeler la fonction AfxTrace qui est
j'imagine toujours la fonction Win32 qui affiche le texte dans le
debugger... Mais le reste est assez obscur pour moi... A quoi sert le
(void)0 ? Et pourquoi faire le test ternaire qui revoit toujours vrai
?


J'imagine que le but, c'était de faire un peu comme assert. Le problème,
sans doute, c'est que ::AfxTrace est une fonction vararg, comme printf
et compagnie. (Je ne le connais pas, mais je suppose. C'est la seule
motivation que je vois pour ne pas avoir servir d'une solution plus
classique.) Alors, ils écrivent quelque chose du genre :

#ifdef NDEBUG
#define __COND 1
#else
#define __COND 0
#endif

#define TRACE __COND ? (void)0 : ::AfxTrace

Un bon compilateur reconnaître que 1, c'est vrai, et que la partie
derrière le : ne pourrait jamais être executée, et le supprimierait
toute référence à la fonction. Du coup, tu peux écrire quelque chose du
genre :

TRACE( "bidon = %d, truc = %6.4fn", bidon, truc ) ;

Si NDEBUG est défini, la condition est 1, et la fonction ne serait pas
appelée. Si NDEBUG n'est pas défini, la condition est 0 (fausse), et on
appelle la fonction.

Et si je veux afficher le trace même en mode production, j'écris :

1 + TRACE( "bidon = %d, true = %fn", bidon, truc ) ;

et ça marche encore:-). (Je ne sais pas si c'est exprès, ou un accident
de l'implémentation.)

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
Le Géant Vert
sinon y'a aussi moyen d'utiliser DebugOutputString() (à moins que ce ne
soit OutputDebugString(), je me manque tout le temps...) pour sortir des
infos dans la fenetre de debug.

Guillaume Gourdin wrote:

Bonjour, je suis allé farffouiller dans Afx.h pour voir la definition de la
macro TRACE (qui permet d'afficher du texte dans le debugger de Visual), et
je suis tombé sur ça (en version release, en debug, TRACE est juste remplacé
par ::AfxTrace) :

#define TRACE 1 ? (void)0 : ::AfxTrace

Est-ce que quelqu'un pourrait m'expliquer à quoi sert cette macro ?
J'imagine qu'elle sert à ne pas appeler la fonction AfxTrace qui est
j'imagine toujours la fonction Win32 qui affiche le texte dans le
debugger... Mais le reste est assez obscur pour moi... A quoi sert le
(void)0 ? Et pourquoi faire le test ternaire qui revoit toujours vrai ?

Merci de vos lumières !