2

デバッグ時にいくつかのログ メッセージを表示したいと考えています。1つのオプションは、非常に醜いものを使用することです

#ifdef DEBUG
    std::cout << "I'm in debug mode!\n";
#endif

JUCEライブラリには、デバッグ ペインにテキストを出力する便利なマクロがあります。

DBG("I'm in debug mode!")

juce ソリューションを使用すると、次のような望ましいことを行うこともできます

int x = 4;
DBG(String("x=") + String(x))

std:: または boost:: に同様のきちんとしたメソッドが存在するかどうかを知りたい

4

3 に答える 3

6

自分で書いてみませんか:

#ifdef DEBUG
#define DBG(x) std::cout << x;
#else
#define DBG(x)
#endif

名前空間の場合

namespace DBG
{
inline void DBG(const char* x)
{
#ifdef DEBUG
    std::cout << x;
#endif
}
}
于 2012-05-04T11:27:13.667 に答える
2

printf のようなものが必要な場合は、少し別のマクロを使用する必要があります。

void DebugPrintLn(const char* format, ...);
inline void Nothing(...) {}

#ifdef DEBUG
#define DBG DebugPrintLn
#else
#define DBG Nothing // Or __noop on Visual C++
#endif

Usingは移植可能ですが、引数は引き続き計算されます (__noop は、VC++ 固有Nothingの引数が計算されないことを保証します)。マクロ変数の引数 (GCC と最新の VC++ の両方で利用可能) を使用できる場合はより良い: 移植可能な方法で引数の計算をスキップすることさえできます:

#ifdef DEBUG
#define DBG(...) DebugPrintLn(__VAR_ARGS__)
#else
#define DBG(...) ((void)0)
#endif

いずれにせよ、同じように使用します。

DBG("Lucky day: %s %i", "Friday", 13);
于 2012-05-04T11:43:22.513 に答える
0

また、移植可能な 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');
}

改善/提案/貢献は大歓迎です;-)

于 2013-01-30T16:35:48.483 に答える