Której funkcji należy użyć do wyprowadzenia tekstu w oknie „Dane wyjściowe” w programie Visual Studio?
Próbowałem, printf()
ale to się nie pojawia.
c++
visual-c++
Zacisk
źródło
źródło
WCHAR szBuff[1024]
_vsnwprintf
Jeśli jest to dane wyjściowe do debugowania, to OutputDebugString jest tym, czego chcesz. Przydatne makro:
#define DBOUT( s ) \ { \ std::ostringstream os_; \ os_ << s; \ OutputDebugString( os_.str().c_str() ); \ }
Dzięki temu możesz mówić na przykład:
DBOUT( "The value of x is " << x );
Możesz to rozszerzyć za pomocą makr
__LINE__
i,__FILE__
aby uzyskać jeszcze więcej informacji.Dla osób korzystających z Windows i szerokiej krainy postaci:
#include <Windows.h> #include <iostream> #include <sstream> #define DBOUT( s ) \ { \ std::wostringstream os_; \ os_ << s; \ OutputDebugStringW( os_.str().c_str() ); \ }
źródło
Użyj
OutputDebugString
funkcji lubTRACE
makra (MFC), które pozwala naprintf
formatowanie w stylu: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 );
źródło
Przydatna wskazówka - jeśli używasz,
__FILE__
a__LINE__
następnie sformatujesz debugowanie jako:"file(line): Your output here"
następnie po kliknięciu tego wiersza w oknie danych wyjściowych program Visual Studio przeskoczy bezpośrednio do tego wiersza kodu. Przykład:
#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)
Napisałem o tym post na blogu, więc zawsze wiedziałem, gdzie mogę to sprawdzić: https://windowscecleaner.blogspot.co.nz/2013/04/debug-output-tricks-for-visual-studio.html
źródło
Użyj OutputDebugString zamiast afxDump.
Przykład:
#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("[...]")); }
źródło
#define WIN32_LEAN_AND_MEAN #include <Windows.h> wstring outputMe = L"can" + L" concatenate\n"; OutputDebugString(outputMe.c_str());
źródło
#include <string>
Mimo że
OutputDebugString
rzeczywiście wyświetla ciąg znaków w konsoli debugera, nie jest dokładnie tak, jak wprintf
przypadku, gdy ta ostatnia może formatować argumenty przy użyciu%
notacji i zmiennej liczby argumentów, cośOutputDebugString
nie działa.Sprowadziłbym przypadek, że
_RPTFN
makro,_CRT_WARN
przynajmniej z argumentami, jest w tym przypadku lepszym konkurentem - formatuje główny ciąg podobnie jakprintf
zapisując wynik do konsoli debuggera.A minor (i dziwne, moim zdaniem) zastrzeżenie z nim jest to, że wymaga co najmniej jeden argument następujący ciąg formatu (ten z całą
%
substytucji), ograniczenieprintf
czy nie cierpią.W przypadkach, w których potrzebujesz
puts
podobnej funkcjonalności - bez formatowania, po prostu pisz ciąg taki, jaki jest - istnieje jego siostra_RPTF0
(która ignoruje argumenty następujące po ciągu formatu, kolejne dziwne zastrzeżenie). LubOutputDebugString
oczywiście.A tak przy okazji, jest też wszystko od
_RPT1
do,_RPT5
ale ich nie próbowałem. Szczerze mówiąc, nie rozumiem, dlaczego zapewniam tak wiele procedur, które zasadniczo robią to samo.źródło