我想在调试时显示一些日志消息。一种选择是使用非常丑陋的
#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 ::
中是否存在类似的方法答案 0 :(得分: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
}
}
答案 1 :(得分: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
使用Nothing
是可移植的,但仍然计算参数(__ noop保证任何参数将不计算,VC ++特定)。如果你可以使用宏变量参数(在GCC和最新的VC ++上都可用),那就更好了:你甚至可以以便携方式跳过任何参数计算:
#ifdef DEBUG
#define DBG(...) DebugPrintLn(__VAR_ARGS__)
#else
#define DBG(...) ((void)0)
#endif
无论如何,你都以同样的方式使用它:
DBG("Lucky day: %s %i", "Friday", 13);
答案 2 :(得分: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');
}
欢迎任何改进/建议/贡献; - )