MFC TRACE Macro for Console Applications
Posted
by Thomas Rizos
on February 21st, 2001
This example will post Messages to the tracer built-in with Visual Studio IDE, TraceEx Also includes source file and code line which can be used as shortcut when double clicked on.
/* Trace.h */ #ifndef __TRACE_H__ #define __TRACE_H__ #include <crtdbg.h> #include <stdarg.h> #include <stdio.h> #include <string.h> #ifdef _DEBUG #define TRACEMAXSTRING 1024 char szBuffer[TRACEMAXSTRING]; inline void Trace(const char* format,...) { va_list args; va_start(args,format); int nBuf; nBuf = _vsnprintf(szBuffer, TRACEMAXSTRING, format, args); va_end(args); _RPT0(_CRT_WARN,szBuffer); } #define TraceEx _snprintf(szBuffer,TRACEMAXSTRING,"%s(%d): ", \ &strrchr(__FILE__,'\\')[1],__LINE__); \ _RPT0(_CRT_WARN,szBuffer); \ Trace #else inline void Trace(0); inline void TraceEx(0); #endif #endif // __TRACE_H__
Example
Here's all you have to do to use this macro!
#include "trace.h"
int main(void)
{
TraceEx("Somethings wrongs here %d\n",1)
}
Running this application will result in the following output:
main.cpp(5): Somethings wrong here 1Other features that could be included are ThreadID, ProcessID etc. fun debugging.

Comments
This macro include any dangurous case.
Posted by Legacy on 07/27/2003 12:00amOriginally posted by: tae young park
This macro include any dangurous case.
If this macro is used bellow example.
example:
if( ... ) {
} else
TraceEx( "trace sample.." );
This example code will be expanded
if( ... ) {
} else
_snprintf(szBuffer, TRACEMAXSTRING, "%s(%d" : ",
&strchr(__FILE__,'\\')[1], __LINE__);
_RPT0(_CRT_WARN,szBuffer);
Trace("trace sample..");
so last two line will be executed in any case.
therefore this macro must be used with a parenthesis.
if( ... ) {
} else
{
TraceEx( "trace sample..");
}
Be carefull !
-
ReplyParenthese
Posted by jjwalters on 02/17/2005 05:38pmWouldn't it be more sensible to modify the macro slightly to allow for your if( ... ) { } else TraceEx( "trace sample.." ); text? Put the parentheses around the macro #define TraceEx {_snprintf(szBuffer,TRACEMAXSTRING,"%s(%d): ", \ &strrchr(__FILE__,'\\')[1],__LINE__); \ _RPT0(_CRT_WARN,szBuffer); \ Trace}ReplyUseful (-_-)
Posted by Legacy on 05/13/2003 12:00amOriginally posted by: Janus.K
z
Reply
Release build errors
Posted by Legacy on 02/01/2002 12:00amOriginally posted by: suma
I get the following error message on release build
error C2182: 'Trace' : illegal use of type 'void'
error C2433: 'Trace' : 'inline' not permitted on data declarations
error C2182: 'TraceEx' : illegal use of type 'void'
error C2433: 'TraceEx' : 'inline' not permitted on data declarations
These error corresponds to the following lines
#define TraceEx _snprintf(szBuffer,TRACEMAXSTRING,"%s(%d): ", \
&strrchr(__FILE__,'\\')[1],__LINE__); \
_RPT0(_CRT_WARN,szBuffer); \
Trace
#else
inline void Trace(0);
inline void TraceEx(0);
#endif
Reply
Good job ;-) !!!
Posted by Legacy on 10/23/2001 12:00amOriginally posted by: Hartmut
This was what I really needed. Well done !!!
Reply