Visual Studioの「出力」ウィンドウにテキストを出力するには、どの関数を使用する必要がありますか?
printf()
を試しましたが、表示されません。
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);
}
これがデバッグ出力用の場合、 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() ); \
}
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 );
役に立つヒント-__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
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
wstring outputMe = L"can" + L" concatenate\n";
OutputDebugString(outputMe.c_str());
OutputDebugString
は実際にデバッガコンソールに文字列を出力しますが、後者はprintf
とは異なり、後者は_%
_表記と可変数の引数を使用して引数をフォーマットできます、OutputDebugString
にはありません。
少なくとも__RPTFN
_引数を持つ __CRT_WARN
_ マクロは、この場合により適していると判断します-それは、printf
のように主要な文字列をフォーマットします。デバッガーコンソールへの結果。
それに関するマイナーな(そして奇妙なことに、私の意見では)警告は、フォーマット文字列(置換のためのすべての_%
_を持つもの)に続く少なくとも1つの引数を必要とすることです、制限printf
notに苦しむ。
puts
のような機能が必要な場合(フォーマットせず、文字列をそのまま記述する)には、その兄弟__RPTF0
_があります(フォーマット文字列に続く引数を無視します、別の奇妙な警告)。またはもちろんOutputDebugString
。
ところで、__RPT1
_から__RPT5
_までのすべてがありますが、私はそれらを試していません。正直なところ、なぜ多くの手順がすべて同じことを本質的に行うのかを理解できません。
AfxDumpの代わりにOutputDebugStringを使用します。
例:
#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("[...]"));
}