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 ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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 :
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 :
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 :
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
"Guillaume Gourdin" <toto@toto.com> wrote in message
news:<c7fm0a$als$1@news.tiscali.fr>...
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 :
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 :
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 :
"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 :
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 :
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 :
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
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 !
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 ?
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 ?