7 ответов:
OutputDebugString функция сделает это.
пример кода
void CClass::Output(const char* szFormat, ...) { char szBuff[1024]; va_list arg; va_start(arg, szFormat); _vsnprintf(szBuff, sizeof(szBuff), szFormat, arg); va_end(arg); OutputDebugString(szBuff); }
если это для вывода отладки, то OutputDebugString это то, что вы хотите. Полезный макрос :
#define DBOUT( s ) \ { \ std::ostringstream os_; \ os_ << s; \ OutputDebugString( os_.str().c_str() ); \ }Это позволяет говорить такие вещи, как:
DBOUT( "The value of x is " << x );вы можете расширить это с помощью
__LINE__и__FILE__макросы, чтобы дать еще больше информации.для тех, кто в окнах и широкий характер Земли:
#include <Windows.h> #include <iostream> #include <sstream> #define DBOUT( s ) \ { \ std::wostringstream os_; \ os_ << s; \ OutputDebugStringW( os_.str().c_str() ); \ }
использовать
OutputDebugString
полезный совет - если вы используете
__FILE__и__LINE__затем отформатируйте отладку как:"file(line): Your output here"затем при нажатии на эту строку в окне вывода Visual Studio перейдет непосредственно к этой строке кода. Пример:
#include <Windows.h> #include <iostream> #include <sstream> void DBOut(const char *file, const int line, const WCHAR *s) { std::wostringstream os_; os_ << file << "(" << line << "): "; os_ << s; OutputDebugStringW(os_.str().c_str()); } #define DBOUT(s) DBOut(__FILE__, __LINE__, s)я писал в блоге об этом, так что я всегда знал, где я мог бы посмотреть: https://windowscecleaner.blogspot.co.nz/2013/04/debug-output-tricks-for-visual-studio.html
используйте OutputDebugString вместо afxDump.
пример:
#define _TRACE_MAXLEN 500 #if _MSC_VER >= 1900 #define _PRINT_DEBUG_STRING(text) OutputDebugString(text) #else // _MSC_VER >= 1900 #define _PRINT_DEBUG_STRING(text) afxDump << text #endif // _MSC_VER >= 1900 void MyTrace(LPCTSTR sFormat, ...) { TCHAR text[_TRACE_MAXLEN + 1]; memset(text, 0, _TRACE_MAXLEN + 1); va_list args; va_start(args, sFormat); int n = _vsntprintf(text, _TRACE_MAXLEN, sFormat, args); va_end(args); _PRINT_DEBUG_STRING(text); if(n <= 0) _PRINT_DEBUG_STRING(_T("[...]")); }
#define WIN32_LEAN_AND_MEAN #include <Windows.h> wstring outputMe = L"can" + L" concatenate\n"; OutputDebugString(outputMe.c_str());
хотя
OutputDebugStringдействительно выводит строку символов на консоль отладчика, это не совсем такprintfчто касается последнего, способного форматировать аргументы с помощью%нотация и переменное количество аргументов, что-тоOutputDebugStringне делать.я бы сделал так, что
_RPTFNмакрос, с_CRT_WARNаргумент по крайней мере, является лучшим претендентом в этом случае-он форматирует основную строку так же, какprintf, запись результата в консоль отладчика.незначительная (и странная, на мой взгляд) оговорка с ней заключается в том, что она требует хотя бы один аргумент после строки формата (один со всеми
%для замены), ограничениеprintfтут не страдают от.для случаев, когда нужно
putsкак функциональность -- нет форматирования, просто писать строку как есть -- есть его брат_RPTF0(который игнорирует аргументы, следующие за строкой формата, еще один странный нюанс). ИлиOutputDebugStringконечно.и кстати, там тоже все от
_RPT1до_RPT5но я не пробовал их. Честно говоря, я не понимаю, почему так много процедур все делают по существу одно и то же.
Comments