6

OutputDebugString method seems rather tedious and seems only limited to string and not polymorphic. What should I do if I want to output some integer or other variable type ?

Hope some function like std::cout exists !

1

5 Answers 5

6

I'm pretty sure you could write a streambuf implementation that outputs via OutputDebugString. It's not entirely straight forward, but possible.

It would certainly be possible to use something like this:

std::stringstream ss; ss << something << another << variable << here << endl; OutputDebugString(ss.str().c_str()); 

You may need to use MultiByteToWideChar to convert the c_str() to a wide string, if you have "UNICODE" enabled in your project.

Sign up to request clarification or add additional context in comments.

8 Comments

VS reported incomplete type error at std::stringstream ss ?
You need to #include <sstream> then.
Also reported incompatible type error at OutputDebugString(ss.str().c_str()); ? const char * not compatible with LPCWSTR.
After a minute or two the incompatible type error disappears automatically.
@CDT It still won't compile, though. Use std::wstringstream instead (note the w), since all Windows code should be written using Unicode strings.
|
2

Since the accepted answer doesn't really provide a working version:

If you're not concerned with unicode - though you probably should be if you're shipping anything, I'll assume you won't be shipping it with OutputDebugString included - you can use one of the other versions, such as OutputDebugStringA:

stringstream ss; ss << "Hello World\n"; OutputDebugStringA(ss.str().c_str()); 

Comments

1

Use a class like this:

class stringbuilder { public: stringbuilder() { } template< class T > stringbuilder& operator << ( const T& val ) { os << val; return *this; } operator std::string () const { return os.str(); } private: std::ostringstream os; }; 

And pass the output to a wrapper around OutputDebugString (or anything else that logs strings only):

void MyOutputDebugString( const std::string& s ) { ::OutputDebugString( s.c_str() ); } //usage: MyOutputDebugString( stringbuilder() << "integer " << 5 ); 

2 Comments

Thanks, but it seems I got some stackoverflow with this method.
that's probably beacuse the OutputDebugString warpper is in the global namespace, it shouldn't be there, edited. Anyway the principle in this answer is exactly the same as Mats Petersson's, just written in a reusable way.
1

A macro for Mats Petersson's answer, with unicode support:

#define odslog(msg) { std::wstringstream ss; ss << msg; OutputDebugStringW(ss.str().c_str()); } 

Usage:

odslog("A string " << 123123 << L"A wide string" << "\n"); 

Comments

0

In addition, if you use MFC then you can use TRACE TRACE1 TRACE2 ... macros that work like printf to the debug output.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.