Как записать в окно вывода в Visual Studio? - PullRequest
73 голосов
/ 19 июля 2009

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

Я пытался printf(), но он не появляется.

Ответы [ 7 ]

77 голосов
/ 19 июля 2009

Функция 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);
}
73 голосов
/ 19 июля 2009

Если это для отладочного вывода, то 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() );  \
}
18 голосов
/ 19 июля 2009

Используйте функцию 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 );
2 голосов
/ 12 мая 2018

Полезный совет - если вы используете __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

0 голосов
/ 19 мая 2018
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

wstring outputMe = L"can" + L" concatenate\n";
OutputDebugString(outputMe.c_str());
0 голосов
/ 25 апреля 2018

Несмотря на то, что OutputDebugString действительно печатает строку символов в консоли отладчика, это не совсем то же самое, что printf, поскольку последняя способна форматировать аргументы с использованием нотации % и переменное число аргументов, что-то OutputDebugString не делает.

Я бы сказал, что макрос _RPTFN с аргументом _CRT_WARN лучше подходит в этом случае - он форматирует главную строку так же, как printf, записывая результат на консоль отладчика.

Небольшая (и, на мой взгляд, странная) оговорка в том, что для нее требуется хотя бы один аргумент после строки формата (тот, который содержит все % для подстановки), ограничение printf страдает не от.

Для случаев, когда вам нужна функциональность, подобная puts - нет форматирования, просто пишите строку как есть - есть ее брат _RPTF0 (который игнорирует аргументы после строки форматирования, еще одно странное предостережение). Или OutputDebugString конечно.

И, между прочим, есть все от _RPT1 до _RPT5, но я их не пробовал. Честно говоря, я не понимаю, зачем предоставлять так много процедур, которые делают одно и то же.

0 голосов
/ 05 октября 2017

Используйте 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("[...]"));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...