2009-01-30 4 views

Respuesta

26

Construye tu propia.

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 

a continuación, sólo #include "trace.h" y ya está todo listo.

Descargo de responsabilidad: Acabo de copiar/pegar este código de un proyecto personal y saqué algunas cosas específicas del proyecto, pero no hay ninguna razón por la que no debería funcionar. ;-)

+0

wvsprintf no maneja los números de coma flotante (% f). En cambio, se puede usar vsprintf. – JcMaco

+2

Para Linux C++, modifiqué su código con '#include ', '#include ', reemplacé 'wvsprinf' con' vsnprinf'. Luego reemplazó 'OutputDebugString' con' std :: clog << buffer << std :: flush; '. – enthusiasticgeek

+3

En compilaciones de versión, Visual Studio genera una advertencia C4013 (nivel de advertencia 3) y también advertencias C4555 (nivel de advertencia) para cada aparición de RASTREO. Para evitar las advertencias, cambié la parte 'false && _trace' en' __noop'. Esta es también la forma en que MFC lo hace. –

3

Puede probar la función DebugOutputString. TRACE solo está habilitado en las compilaciones de depuración.

7

Si usa ATL puede probar ATLTRACE.

TRACE se define en AFX.H como (al menos en vs 2008):

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

Y ATLTRACE se puede encontrar en atltrace.h

+0

que quería utilizar esta estrategia, sin embargo esto no es algo de equipaje ATL adicional que viene junto con esto para un proyecto que no es ATL. Estoy trabajando con C++/CLI con Window Forms y agregando la inclusión de 'atltrace.h' causó errores de compilación, así que tomé el enfoque de simplemente usar' OuputDebugString() 'en su lugar, ya que solo tengo algunas cadenas de texto para producir en varios lugares. –

1

Según tengo entendido, wvsprintf tiene problemas con el formateo. Utilice _vsnprintf (o thcar versión _vsntprintf) en lugar

1

Gracias a estas respuestas que he fijos mi error :-)

Aquí comparto mi macro TRACE en C++ basado en las ideas de Ferruccio y 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 

ejemplo:

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

Cualquier mejoras/sugerencias/contribuciones son bienvenidas ;-)

Cuestiones relacionadas