我实际上会以完全不同的方式来做。首先定义打开或关闭打印的标志:
// uncomment to turn off debug printing
#define DEBUG_PRINT 1
然后根据定义状态有条件地定义您的打印机宏DEBUG_PRINT
:
#ifdef DEBUG_PRINT
#define PRINT (X) (printf(x))
#else
#define PRINT (x)
#endif
可以简单地用作:
PRINT("foo");
但实际上,我根本不会做任何这些事情。相反,我有上面的开启/关闭标志,然后构建一个执行打印的类:
// comment out to not do debug printing
//#define DEBUG_PRINTING 1
#ifdef DEBUG_PRINTING
class Printer
{
public:
Printer() {}
~Printer()
{
std::cout << mOutput.str() << "\n";
}
template <typename TYPE> Printer& operator<< (const TYPE& val)
{
mOutput << val;
return * this;
}
template <size_t N> Printer& operator<< (const char(&ary)[N])
{
mOutput << ary;
return * this;
}
private:
std::stringstream mOutput;
};
#else
class Printer
{
public:
Printer() {};
template <typename TYPE> Printer& operator<< (const TYPE& val)
{
return * this;
}
template <size_t N> Printer& operator<< (const char(&ary)[N])
{
return * this;
}
};
#endif
int main()
{
Printer() << "My output here. " << 42;
}
在未定义标志的优化构建中,大部分(如果不是全部)代码将被优化掉。