• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 867
  • Last Modified:

OutputDebugString()

In a VC6 WinAPI program, is it necessary to enclose OutputDebugString() calls in #ifdef _DEBUG blocks, or is the function removed in release builds (like with the TRACE() macro)?

If the function call (and overhead) are not removed in release mode, then does the WinAPI or CRT provide a suitable substitute?
0
TookH
Asked:
TookH
  • 5
  • 5
  • 3
  • +2
1 Solution
 
djbusychildCommented:
the function really doesn't have to do with the "debug" mode. it simply sends strings to the debugger ( i.e. dbwin32 ) it will look for a debugger that it can hook to, if none is available it'll just not to anything. if you don't want it in your release code you should #ifdef it
0
 
MichaelSCommented:
It's a fucntion (like was mentioned earlie). Usually I define another function like:

Trace(LPSTR szString)
{  
#ifndef _DEBUG
OutputDebugString(szString);
#endif
}

and I use it evrywhere in my code where I want to have some traces.
0
 
jkrCommented:
You don't HAVE to guard that, but anybodz witha tracer tool will be able to see the output.

BUT:

#ifdef _DEBUG
#define ODS( x) OutputDebugString ( x)
#else
#define ODS( x)

would do it more 'globally'...
0
Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

 
TookHAuthor Commented:
jkr, I like your suggestion. I'm thinking of doing something like this:

void OutputDebug( char *s, ... )
{
    va_list argList;
    char msg[256];

    va_start( argList, s );
    vsprintf( msg, s, argList);
    va_end( argList );

    OutputDebugString( msg );
}

Then I could use a macro like yours to invoke it only in debug builds. I'm not sure if it's possible to pass variable argument lists to a macro, though. Any suggestions?
0
 
jkrCommented:
>>I'm not sure if it's possible
>>to pass variable argument lists to a macro, though. Any
>>suggestions?

Well, you cannot use variable arguments in a macro - but you can remedy the overhead in the function calls by using

void OutputDebug( char *s, ... )
{
#ifdef _DEBUG
   va_list argList;
   char msg[256];

   va_start( argList, s );
   vsprintf( msg, s, argList);
   va_end( argList );

   OutputDebugString( msg );
#endif
}

Alternatively, you could go the way e.g. MFC does:

#ifdef _DEBUG
#define OutputDebug0( psz)                  OutputDebug     ( psz)
#define OutputDebug1( psz, p1)              OutputDebug     ( psz, p1)
#define OutputDebug2( psz, p1, p2)          OutputDebug     ( psz, p1, p2)
#define OutputDebug3( psz, p1, p2, p3)      OutputDebug     ( psz, p1, p2, p3)
#define OutputDebug4( psz, p1, p2, p3, p4)  OutputDebug     ( psz, p1, p2, p3, p4)

#else   /*  ndef _DEBUG     */

#define OutputDebug0( psz)                  ( ( void) 0)
#define OutputDebug1( psz, p1)              ( ( void) 0)
#define OutputDebug2( psz, p1, p2)          ( ( void) 0)
#define OutputDebug3( psz, p1, p2, p3)      ( ( void) 0)
#define OutputDebug4( psz, p1, p2, p3, p4)  ( ( void) 0)

#endif  /*  ndef _DEBUG     */
0
 
djbusychildCommented:
you could also remedby function call overhead by making it inline. Although there's no gurantee that it'll be inline.
0
 
TookHAuthor Commented:
I'm going to use #ifdef within the function body. If performance becomes critical, I'll switch to using the MFC method and/or djbusychild's suggestion.

Thanks everyone.
0
 
nietodCommented:
Does anyone know if this accepted answer was posted as a comment or as an answer?
0
 
MichaelSCommented:
As I remember it was a comment, why you are so interested in that?
0
 
nietodCommented:
We're trying to measure the number of comments vs answers.

I'm putting it down as a comment for now, if you aren't really sure, let me know (or if someone else is sure.)
0
 
MichaelSCommented:
I am not really sure, it's just a guess.
0
 
nietodCommented:
Back into the "undecided" category....
0
 
MichaelSCommented:
Somehow I think they (EE) probably sould remote answers at all, leave only comments. If it's not a secret, what is the proportion?
0
 
nietodCommented:
Too early to tell, but currently 7 to 4--I think--in favor of comments.
0
 
MichaelSCommented:
Well, one more question, what is the perpuse actually?
0
 
jkrCommented:
It was a comment.
0
 
nietodCommented:
make up your minds...  :-)
0
 
TookHAuthor Commented:
It was a comment.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

  • 5
  • 5
  • 3
  • +2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now