Какую функцию следует использовать для вывода текста в окно «Вывод» в Visual Studio?
Я пробовал, printf()
но ничего не получается.
Ответы:
Функция 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);
}
WCHAR szBuff[1024]
_vsnwprintf
Если это для вывода отладки, то OutputDebugString - это то, что вам нужно. Полезный макрос:
#define DBOUT( s ) \
{ \
std::ostringstream os_; \
os_ << s; \
OutputDebugString( os_.str().c_str() ); \
}
Это позволяет вам говорить такие вещи, как:
DBOUT( "The value of x is " << x );
Вы можете расширить это с помощью __LINE__
и __FILE__
макросы , чтобы дать еще больше информации.
Для тех, кто пользуется Windows и широким характером:
#include <Windows.h>
#include <iostream>
#include <sstream>
#define DBOUT( s ) \
{ \
std::wostringstream os_; \
os_ << s; \
OutputDebugStringW( os_.str().c_str() ); \
}
Используйте OutputDebugString
функцию или TRACE
макрос (MFC), который позволяет выполнять printf
форматирование в стиле:
int x = 1;
int y = 16;
float z = 32.0;
TRACE( "This is a TRACE statement\n" );
TRACE( "The value of x is %d\n", x );
TRACE( "x = %d and y = %d\n", x, y );
TRACE( "x = %d and y = %x and z = %f\n", x, y, z );
Полезный совет - если вы используете, __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("[...]"));
}
Несмотря на то, что OutputDebugString
действительно выводит строку символов в консоль отладчика, это не совсем то, printf
что последняя может форматировать аргументы, используя %
нотацию и переменное количество аргументов, что-тоOutputDebugString
не происходит.
Я бы сказал, что _RPTFN
макрос, _CRT_WARN
по крайней мере с аргументом, в этом случае лучше подходит - он форматирует основную строку так же, как printf
запись результата в консоль отладчика.
Незначительная (и странно, на мой взгляд) предостережение с ним в том , что он требует , по крайней мере один аргумент следующий в строке формата (тот , со всеми %
для замещения), ограничение printf
делает не страдает от.
Для случаев, когда вам нужна puts
подобная функциональность - без форматирования, просто запись строки как есть - есть ее родственник _RPTF0
(который игнорирует аргументы, следующие за строкой формата, еще одно странное предостережение). Или жеOutputDebugString
конечно.
И, кстати, тоже есть все от _RPT1
до, _RPT5
но я не пробовал. Честно говоря, я не понимаю, зачем предлагать столько процедур, которые по сути делают одно и то же.