Как записать в окно вывода в Visual Studio?



какую функцию следует использовать для вывода текста в окно "вывод" в Visual Studio?



пробовал printf() но он не появляется.

1104   7  

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

    Ничего не найдено.