webentwicklung-frage-antwort-db.com.de

Wie schreibe ich in das Ausgabefenster in Visual Studio?

Welche Funktion sollte ich verwenden, um Text in das Fenster "Ausgabe" in Visual Studio auszugeben?

Ich habe printf() ausprobiert, aber es erscheint nicht.

68
clamp

OutputDebugString Funktion wird es tun.

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);
}
72
Sorantis

Wenn dies für die Debug-Ausgabe ist, ist OutputDebugString das, was Sie wollen. Ein nützliches Makro:

#define DBOUT( s )            \
{                             \
   std::ostringstream os_;    \
   os_ << s;                   \
   OutputDebugString( os_.str().c_str() );  \
}

So können Sie Dinge sagen wie:

DBOUT( "The value of x is " << x );

Sie können dies mit den Makros __LINE__ und __FILE__ erweitern, um noch mehr Informationen zu erhalten.

Für die 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() );  \
}
70
anon

Verwenden Sie die OutputDebugString -Funktion oder das TRACE macro (MFC), mit dem Sie printf- Formatierungen vornehmen 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 );
18
Reunanen

Nützlicher Tipp - Wenn Sie __FILE__ und __LINE__ verwenden, formatieren Sie Ihren Debug als:

"file(line): Your output here"

wenn Sie dann auf diese Zeile im Ausgabefenster 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 darüber einen Blogbeitrag geschrieben, so wusste ich immer, wo ich nachschlagen konnte: https://windowscecleaner.blogspot.co.nz/2013/04/debug-output-tricks-for-visual-studio .html

1
parsley72
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

wstring outputMe = L"can" + L" concatenate\n";
OutputDebugString(outputMe.c_str());
0
Andrew

Auch wenn OutputDebugString tatsächlich eine Zeichenfolge an die Debugger-Konsole druckt, ist es nicht genau wie printf, da letztere Argumente mit der %-Notation und einer variablen Anzahl von Argumenten formatieren können, etwas OutputDebugString tut dies nicht.

Ich würde den Fall machen, dass das Makro _RPTFN mit mindestens dem Argument _CRT_WARN in diesem Fall ein besserer Anwender ist - es formatiert den Principal-String ähnlich wie printf und schreibt das Ergebnis in die Debugger-Konsole.

Eine geringfügige (und meiner Meinung nach merkwürdige) Einschränkung besteht darin, dass mindestens ein Argument nach der Formatzeichenfolge erforderlich ist (das Argument mit dem gesamten % für die Ersetzung). Eine Einschränkung printf leidet an not von.

In den Fällen, in denen Sie eine puts-ähnliche Funktionalität benötigen - keine Formatierung, sondern nur den String in der vorliegenden Form schreiben - gibt es den gleichnamigen Code _RPTF0 (der Argumente, die auf den Formatstring folgen, ignoriert). Oder OutputDebugString natürlich.

Übrigens gibt es auch alles von _RPT1 bis _RPT5, aber ich habe es nicht ausprobiert. Ehrlich gesagt verstehe ich nicht, warum es so viele Verfahren gibt, die alle dasselbe machen.

0
amn

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("[...]"));
}
0
Maurizio TALPO