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);
}
WCHAR szBuff[1024]
_vsnwprintf
이것이 디버그 출력 인 경우 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
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("[...]"));
}
OutputDebugString
실제로 디버거 콘솔에 문자열을 인쇄 하지만 printf
후자가 %
표기법과 가변 개수의 인수를 사용하여 인수를 형식화 할 수 있다는 점 과 는 정확히 같지 OutputDebugString
않습니다.
나는 적어도 인수가 있는 _RPTFN
매크로 _CRT_WARN
가이 경우에 더 나은 구혼 자라고 주장 할 것입니다. 즉, printf
디버거 콘솔에 결과를 기록하는 것처럼 주 문자열을 형식화합니다 .
그것에 대한 사소한 (그리고 이상한, 내 생각에) 경고 는 형식 문자열 다음 에 적어도 하나의 인수 가 필요하다는 것 입니다 (모두 %
for 대체를 가진 인수 ), 제한 printf
이 발생하지 않습니다 .
puts
유사한 기능 이 필요한 경우 ( 형식 지정없이 문자열을 그대로 작성하는 경우) 형제가 있습니다 _RPTF0
(형식 문자열 다음에 오는 인수를 무시하는 또 다른 이상한 경고). 또는 OutputDebugString
물론.
그건 그렇고, 또한 거기에서 모든 것 _RPT1
을 _RPT5
하지만 난 그들을 시도하지 않았습니다. 솔직히, 왜 그렇게 많은 절차를 기본적으로 모두 동일한 작업을 수행하는지 이해하지 못합니다.