Wie schreibe ich in das Ausgabefenster in Visual Studio?

79

Mit welcher Funktion soll ich Text in das Fenster "Ausgabe" in Visual Studio ausgeben?

Ich habe es versucht, printf()aber es wird nicht angezeigt.

Klemme
quelle

Antworten:

84

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);
}
Sorantis
quelle
3
Es gibt immer noch ein Problem damit. _vsnprintf schneidet die formatierte Zeichenfolge möglicherweise so ab, dass sie in den Puffer passt. In diesem Fall wird die Zeichenfolge jedoch nicht ungültig. Siehe msdn.microsoft.com/en-us/library/1kt27hek.aspx und stackoverflow.com/questions/357068 .
ChrisN
Sie verwenden den Multibyte-Zeichensatz in Ihren Compileroptionen. Sie müssen dann die Multibyte-Versionen vonWCHAR szBuff[1024] _vsnwprintf
Lefteris E
Warnung 1 Warnung C4996: '_vsnwprintf': Diese Funktion oder Variable ist möglicherweise unsicher. Verwenden Sie stattdessen _vsnwprintf_s. ;-)
hfrmobile
1
Muss ich etwas # einschließen, damit OutputDebugString funktioniert?
Michele
schließen Sie Windows.h
ΦXocę 웃 Пepeúpa ツ
73

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() );  \
}
Gemeinschaft
quelle
1
Können Sie diese Aussage etwas erklären? - "Sie können dies mit den Makros LINE und FILE erweitern , um noch mehr Informationen zu erhalten."
Yousuf Azad
2
@ sami1592 Diese beiden Makros werden vom Compiler als (Überraschungs-) Zeile und Datei definiert, sodass Sie weitere nützliche Protokolle mit Zeile und Datei automatisch ausgeben können.
ZachB
20

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 );
Reunanen
quelle
Mein Compiler in Visual Studio erkennt ALTTRACE2 oder ALTTRACE nicht. Muss ich etwas einschließen? Liegt es daran, dass es kein MFC-Projekt ist? Es ist nur C ++ für mich.
Michele
Ich habe einen alten 3DES-Algorithmus in Visual Studio 2017, C ++, getestet. Ich habe den Code zum Laufen gebracht, indem ich alle "printf" durch "TRACE" ersetzt habe. Sehr guter Treffer! Vielen Dank!
Paul
3

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

Petersilie72
quelle
0

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("[...]"));
}
Maurizio TALPO
quelle
0
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

wstring outputMe = L"can" + L" concatenate\n";
OutputDebugString(outputMe.c_str());
Andrew
quelle
#include <string>
Andrew
0

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.

amn
quelle