2009-01-30 10 views

Odpowiedz

26

Zbuduj własną rękę.

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 

potem po prostu #include "trace.h" i gotowe.

Nota prawna: Właśnie skopiowałem/wkleiłem ten kod z osobistego projektu i usunąłem niektóre elementy projektu, ale nie ma powodu, dla którego nie powinien on działać. ;-)

+0

wvsprintf nie obsługuje liczb zmiennoprzecinkowych (% f). Zamiast tego można użyć vsprintf. – JcMaco

+2

Dla Linux C++, zmodyfikowałem twój kod za pomocą '#include ', '#include ', zastąpiłem 'wvsprinf' przez' vsnprinf'. Następnie zastąpiono 'OutputDebugString' przez' std :: clog << buffer << std :: flush; '. – enthusiasticgeek

+3

W wersjach wersji Visual Studio generuje ostrzeżenie C4013 (poziom ostrzegawczy 3) oraz ostrzeżenia C4555 (wszystkie poziomy ostrzegawcze) dla każdego wystąpienia TRACE. Aby zapobiec ostrzeżeniom, zmieniłem część 'false && trtrace' na' _noop'. Tak też działa MFC. –

3

Możesz wypróbować funkcję DebugOutputString. TRACE jest włączony tylko w kompilacjach debugowania.

7

Jeśli używasz ATL, możesz spróbować ATLTRACE.

TRACE jest zdefiniowana w afx.h jako (przynajmniej w vs 2008):

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

I ATLTRACE można znaleźć w atltrace.h

+0

Chciałem użyć tego podejścia to jednak istnieją pewne dodatkowy bagaż ATL, która przychodzi wraz z tym do projekt, który nie jest ATL. Pracuję z C++/CLI z Window Forms, a dodanie 'atltrace.h' spowodowało błędy kompilatora, więc zastosowałem podejście' OuputDebugString() ', ponieważ mam tylko kilka ciągów tekstowych do wyprowadzania w różnych miejscach. –

1

W moim rozumieniu wvsprintf ma problem z formatowaniem. Użyj _vsnprintf (lub thcar wersji _vsntprintf) zamiast

1

Dzięki tym odpowiedzi Mam stały mój błąd :-)

Tutaj dzielę TRACE makro w C++ w oparciu o pomysły z Ferruccio i 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 

przykład:

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

Wszelkie ulepszenia/sugestie/składki są mile widziane ;-)

Powiązane problemy