Mit welcher Funktion soll ich Text in das Fenster "Ausgabe" in Visual Studio ausgeben?
Ich habe es versucht, printf()aber es wird nicht angezeigt.
Antworten:
Die OutputDebugString- Funktion erledigt dies.
Beispielcode
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
Wenn dies für die Debug-Ausgabe ist, ist OutputDebugString genau das, was Sie wollen. Ein nützliches Makro:
#define DBOUT( s ) \
{ \
std::ostringstream os_; \
os_ << s; \
OutputDebugString( os_.str().c_str() ); \
}
Auf diese Weise können Sie Dinge sagen wie:
DBOUT( "The value of x is " << x );
Sie können dies mit den Makros __LINE__und erweitern __FILE__, um noch mehr Informationen zu erhalten.
Für diejenigen in Windows und Wide Character Land:
#include <Windows.h>
#include <iostream>
#include <sstream>
#define DBOUT( s ) \
{ \
std::wostringstream os_; \
os_ << s; \
OutputDebugStringW( os_.str().c_str() ); \
}
Verwenden Sie die OutputDebugStringFunktion oder das TRACEMakro (MFC), mit dem Sie die printfFormatierung im Stil durchführen können:
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 );
Nützlicher Tipp - wenn Sie Ihr Debug verwenden __FILE__und __LINE__dann wie folgt formatieren:
"file(line): Your output here"
Wenn Sie dann im Ausgabefenster auf diese Zeile klicken, springt Visual Studio direkt zu dieser Codezeile. Ein Beispiel:
#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)
Ich habe einen Blog-Beitrag darüber geschrieben, damit ich immer wusste, wo ich ihn nachschlagen kann: https://windowscecleaner.blogspot.co.nz/2013/04/debug-output-tricks-for-visual-studio.html
Verwenden Sie OutputDebugString anstelle von afxDump.
Beispiel:
#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("[...]"));
}
Obwohl OutputDebugStringtatsächlich eine Zeichenfolge an die Debugger-Konsole gedruckt wird, ist es nicht genau so printf, dass letztere Argumente mit der %Notation und einer variablen Anzahl von Argumenten formatieren kann , was OutputDebugStringjedoch nicht funktioniert.
Ich würde den Fall vertreten, dass das _RPTFNMakro, _CRT_WARNzumindest mit Argument, in diesem Fall ein besserer Bewerber ist - es formatiert die Hauptzeichenfolge ähnlich wie das printfSchreiben des Ergebnisses in die Debugger-Konsole.
Eine kleinere (und seltsam, meiner Meinung nach ) mit Vorbehalt ist , dass es erfordert mindestens ein Argument nach dem Format - String (der mit allen %für die Substitution), eine Beschränkung printfist nicht leiden.
In Fällen, in denen Sie eine putsähnliche Funktionalität benötigen - keine Formatierung, nur das Schreiben der Zeichenfolge wie sie ist - gibt es ein Geschwister _RPTF0(das Argumente ignoriert, die der Formatzeichenfolge folgen, eine weitere seltsame Einschränkung). Oder OutputDebugStringnatürlich.
Übrigens gibt es auch alles von _RPT1bis, _RPT5aber ich habe sie nicht ausprobiert. Ehrlich gesagt verstehe ich nicht, warum so viele Verfahren bereitgestellt werden, die im Wesentlichen dasselbe tun.