web-dev-qa-db-ja.com

MFC以外のプロジェクトでTRACEマクロを使用するにはどうすればよいですか?

TRACE()マクロを使用して、 Visual Studio 2005 非- [〜#〜] mfc [〜#〜] C++のデバッグウィンドウに出力を取得したいプロジェクトですが、どの追加のヘッダーまたはライブラリが必要ですか?

デバッグ出力ウィンドウにメッセージを表示する方法はありますか?どうすればよいですか?

25
jagttt

あなた自身のものをつくる。

trace.cpp:

#ifdef _DEBUG
bool _trace(TCHAR *format, ...)
{
   TCHAR buffer[1000];

   va_list argptr;
   va_start(argptr, format);
   wvsprintf(buffer, format, argptr);
   va_end(argptr);

   OutputDebugString(buffer);

   return true;
}
#endif

trace.h:

#include <windows.h>
#ifdef _DEBUG
bool _trace(TCHAR *format, ...);
#define TRACE _trace
#else
#define TRACE false && _trace
#endif

次に、#include "trace.h"を実行するだけで、準備が整います。

免責事項:私はこのコードを個人的なプロジェクトからコピーして貼り付け、プロジェクト固有のものをいくつか取り出しましたが、機能しない理由はありません。 ;-)

29
Ferruccio

ATLを使用している場合は、ATLTRACEを試すことができます。

TRACEは、afx.hで次のように定義されています(少なくとも2008年と比較して)。

// extern ATL::CTrace TRACE;
#define TRACE ATLTRACE

そしてATLTRACEはatltrace.hで見つけることができます

7
Ulf Lindback

DebugOutputString関数を試すことができます。 TRACEは、デバッグビルドでのみ有効になります。

3
Fredrik Jansson

これらの回答のおかげで、バグを修正しました:-)

ここでは、Ferruccioとenthusiasticgeekのアイデアに基づいて、C++でTRACEマクロを共有します。

#ifdef ENABLE_TRACE
#  ifdef _MSC_VER
#    include <windows.h>
#    include <sstream>
#    define TRACE(x)                           \
     do {  std::stringstream s;  s << (x);     \
           OutputDebugString(s.str().c_str()); \
        } while(0)
#  else
#    include <iostream>
#    define TRACE(x)  std::clog << (x)
#  endif        // or std::cerr << (x) << std::flush
#else
#  define TRACE(x)
#endif

例:

#define ENABLE_TRACE  //can depend on _DEBUG or NDEBUG macros
#include "my_above_trace_header.h"

int main (void)
{
   int     v1 = 123;
   double  v2 = 456.789;
   TRACE ("main() v1="<< v1 <<" v2="<< v2 <<'\n');
}

どんな改善/提案/貢献も歓迎します;-)

1
olibre

私の理解では、wvsprintfにはフォーマットの問題があります。代わりに_vsnprintf(またはthcarバージョン_vsntprintf)を使用してください

1
sarat