2009-01-30 4 views

Antwort

26

Bauen Sie Ihre eigene zu finden.

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 

dann # include nur "trace.h" und du bist fertig.

Haftungsausschluss: Ich habe diesen Code nur aus einem persönlichen Projekt kopiert und eingefügt und einige projektspezifische Sachen herausgenommen, aber es gibt keinen Grund, dass es nicht funktionieren sollte. ;-)

+0

wvsprintf verarbeitet keine Fließkommazahlen (% f). Stattdessen kann Vsprintf verwendet werden. – JcMaco

+2

Für Linux C++ habe ich Ihren Code mit '#include ', '#include ', ersetzt 'wvsprinf' mit' vsnprinf' geändert. Dann ersetzt "OutputDebugString" durch 'std :: clog << puffer << std :: flush;'. – enthusiasticgeek

+3

In Release-Builds generiert Visual Studio für jedes TRACE-Ereignis eine Warnung C4013 (Warnstufe 3) und außerdem Warnungen C4555 (Warnstufe alle). Um die Warnungen zu verhindern, habe ich den 'false && _trace' Teil in' __noop' ​​geändert. Dies ist auch die Art, wie MFC es tut. –

3

Sie können die DebugOutputString-Funktion versuchen. TRACE ist nur in Debug-Builds aktiviert.

7

Wenn Sie ATL verwenden, können Sie ATLTRACE versuchen.

TRACE wird in AFX.H als (zumindest in vs 2008) definiert:

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

Und ATLTRACE kann in atltrace.h

+0

ich dies diesen Ansatz jedoch nutzen wollte, dass ein zusätzliches ATL Gepäck, das zusammen mit dieser kommt für ein Projekt, das nicht ATL ist. Ich arbeite mit C++/CLI mit Window Forms und addiere die 'atltrace.h' Include-bedingten Compiler-Fehler, so dass ich den Ansatz nutze, nur'OuputDebugString()' zu verwenden, da ich nur einige Text-Strings an verschiedenen Stellen ausgeben muss. –

1

In meinem Verständnis hat wvsprintf Probleme mit der Formatierung. Verwenden Sie _vsnprintf (oder thcar Version _vsntprintf) statt

1

Dank dieser Antworten, die ich meine Fehler behoben haben :-)

Hier habe ich meine TRACE-Makro in C++ teilen basierend auf Ideen von Ferruccio und 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 

Beispiel:

#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'); 
} 

All Verbesserungen/Anregungen/Beiträge sind willkommen ;-)

Verwandte Themen