2

我想在调试时显示一些日志消息。一种选择是使用非常丑陋的

#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

UsingNothing是可移植的,但仍然计算参数(__noop 保证不会计算任何参数,特定于 VC++)。如果您可以使用宏变量参数更好(在 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 回答