learnvst
learnvst

Reputation: 16195

Is there a neat method to output text to debugging pane?

I would like to display some log messages when debugging. One option is to use the very ugly

#ifdef DEBUG
    std::cout << "I'm in debug mode!\n";
#endif

In the JUCE library, there is a nice macro that outputs text to the debugging pane

DBG("I'm in debug mode!")

The juce solution also allows you to do neat stuff like the following that would be desirable

int x = 4;
DBG(String("x=") + String(x))

I would like to know if a similarly neat method exists in std:: or boost::

Upvotes: 2

Views: 2666

Answers (3)

oHo
oHo

Reputation: 54611

I have also written my own portable TRACE macro. I share it here:

#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

example:

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

Any improvements/suggestions/contributions are welcome ;-)

Upvotes: 0

demi
demi

Reputation: 5504

If you want something like printf, you should use a bit another macros:

void DebugPrintLn(const char* format, ...);
inline void Nothing(...) {}

#ifdef DEBUG
#define DBG DebugPrintLn
#else
#define DBG Nothing // Or __noop on Visual C++
#endif

Using Nothing is portable, but arguments still computed (__noop guarantees that any of argument will be not computed, VC++ specific). Better if you can use macros variable arguments (both available on GCC and latest VC++): you may even skip any argument computation in portable way:

#ifdef DEBUG
#define DBG(...) DebugPrintLn(__VAR_ARGS__)
#else
#define DBG(...) ((void)0)
#endif

In any case, you use it the same way:

DBG("Lucky day: %s %i", "Friday", 13);

Upvotes: 2

Luchian Grigore
Luchian Grigore

Reputation: 258618

Why not just write your own:

#ifdef DEBUG
#define DBG(x) std::cout << x;
#else
#define DBG(x)
#endif

For namespaces

namespace DBG
{
inline void DBG(const char* x)
{
#ifdef DEBUG
    std::cout << x;
#endif
}
}

Upvotes: 6

Related Questions