2009-01-30 4 views

Répondre

26

Créer votre propre.

trace.cpp:

#ifdef _DEBUG 
bool _trace(TCHAR *format, ...) 
{ 
    TCHAR buffer[1000]; 

    va_list argptr; 
    va_start(argptr, format); 
    wvsprintf(buffer, format, argptr); 
    va_end(argptr); 

    OutputDebugString(buffer); 

    return true; 
} 
#endif 

trace.h:

#include <windows.h> 
#ifdef _DEBUG 
bool _trace(TCHAR *format, ...); 
#define TRACE _trace 
#else 
#define TRACE false && _trace 
#endif 

puis juste #include "trace.h" et vous êtes tous ensemble. Clause de non responsabilité: Je viens de copier/coller ce code à partir d'un projet personnel et j'enlève des éléments spécifiques au projet, mais il n'y a aucune raison pour que cela ne fonctionne pas. ;-)

+0

wvsprintf ne gère pas les nombres à virgule flottante (% f). Au lieu de cela, vsprintf peut être utilisé. – JcMaco

+2

Pour Linux C++, j'ai modifié votre code avec '#include ', '#include ', remplacé 'wvsprinf' par' vsnprinf'. Puis remplacé 'OutputDebugString' avec' std :: clog << tampon << std :: flush; '. – enthusiasticgeek

+3

Dans les versions de version, Visual Studio génère un avertissement C4013 (niveau d'avertissement 3) et également des avertissements C4555 (niveau d'avertissement tous) pour chaque occurrence TRACE. Pour éviter les avertissements, j'ai changé la partie 'false && _trace' en' __noop'. C'est aussi la façon dont MFC le fait. –

3

Vous pouvez essayer la fonction DebugOutputString. TRACE est uniquement activé dans les versions de débogage.

7

Si vous utilisez ATL, vous pouvez essayer ATLTRACE.

TRACE est défini dans afx.h comme (au moins en 2008 par rapport):

// extern ATL::CTrace TRACE; 
#define TRACE ATLTRACE 

Et ATLTRACE se trouve dans atltrace.h

+0

Je voulais utiliser cette cette approche mais il y a quelques bagages ATL supplémentaire qui vient avec cela pour un projet qui n'est pas ATL. Je travaille avec C++/CLI avec Windows Forms et l'ajout de 'atltrace.h' entraîne des erreurs de compilateur provoquées donc j'ai pris l'approche de simplement utiliser' OuputDebugString() 'car j'ai juste quelques chaînes de texte à sortir à divers endroits. –

1

À mon avis, wvsprintf a un problème avec le formatage. Utilisez _vsnprintf (ou la version thcar _vsntprintf) au lieu

1

Merci à ces réponses que j'ai fixé mon bug :-)

Ici, je partage mon TRACE macro en C++ basé sur des idées de Ferruccio et enthusiasticgeek.

#ifdef ENABLE_TRACE 
# ifdef _MSC_VER 
# include <windows.h> 
# include <sstream> 
# define TRACE(x)       \ 
    do { std::stringstream s; s << (x);  \ 
      OutputDebugString(s.str().c_str()); \ 
     } while(0) 
# else 
# include <iostream> 
# define TRACE(x) std::clog << (x) 
# endif  // or std::cerr << (x) << std::flush 
#else 
# define TRACE(x) 
#endif 

exemple:

#define ENABLE_TRACE //can depend on _DEBUG or NDEBUG macros 
#include "my_above_trace_header.h" 

int main (void) 
{ 
    int  v1 = 123; 
    double v2 = 456.789; 
    TRACE ("main() v1="<< v1 <<" v2="<< v2 <<'\n'); 
} 

Toutes les améliorations/suggestions/contributions sont les bienvenues ;-)

Questions connexes