Яку функцію слід використовувати для виведення тексту у вікно "Вивід" у 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
але я їх не пробував. Чесно кажучи, я не розумію, навіщо пропонувати стільки процедур, які роблять по суті одне і те ж.