![]() |
Development Lifecycle »
Debug Tips »
Trace
Intermediate
Getting around the need for a vararg #define just to automatically use __FILE__ and __LINE__ in a TRACE macroBy Paul MclachlanEver wrote #define TRACE, #define TRACE1, #define TRACE2, etc., just so you could use the __FILE__ macro and printf style formatting in a macro at the same time? |
VC7Win2K, WinXP, Dev, QA
|
|
Advanced Search Add to IE Search |
|
|
|
||||||||||||||||
Someone else has probably done this before, but I haven't seen it, so I had to make this up.
If you want to create a preprocessor macro that outputs something to a log, you generally want one that works something like this:
MYTRACE( "something something: %s (%d)", str, i );
It's a little tricky, because you want it to accept variable arguments, but I often see something like:
#define MYTRACE MyTrace
static inline MyTrace( const char* msg, ... )
{
// ...
}
But, if you wanted MYTRACE to automatically put __FILE__ and __LINE__ into the trace message, you're stuck. You can't use them inside the MyTrace() function because __FILE__ and __LINE__ will always point to the header that defines it instead of the place you call MYTRACE -- and it isn't possible to have a vararg preprocessor macro.
If you're stubborn about such things, you do something like this:
#define MYTRACE1( m, a ) MyTrace( __FILE__, __LINE__, m, a )
#define MYTRACE2( m, a, b ) MyTrace( __FILE__, __LINE__, m, a, b )
#define MYTRACE3( m, a, b, c ) MyTrace( __FILE__, __LINE__, m, a, c )
(And so on). It's horrible to use, though, because you have to keep changing the macro you use when you add an argument.
With a little imagination it's possible to work around this, though (at least in C++):
class tracing_output_debug_string
{
private:
const char* m_file;
int m_line;
enum { MY_BUFFER_SIZE = 1024 };
public:
tracing_output_debug_string( const char* file, int line ) :
m_file( file ),
m_line( line )
{
}
void operator()( const char* Format, ... )
{
// vararg stuff
}
};
#define MYTRACE (tracing_output_debug_string( __FILE__, __LINE__ ))
The downloadable project has an implementation (which writes to ::OutputDebugString()) in a .h file and a little test that shows it, you know, actually works.
I've only tried it on VS.NET (that's what I have), but I'm sure it would work on ... well, just about anything, really.
General
News
Question
Answer
Joke
Rant
Admin
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 9 Jan 2003 Editor: Smitha Vijayan |
Copyright 2003 by Paul Mclachlan Everything else Copyright © CodeProject, 1999-2009 Web21 | Advertise on the Code Project |