jac*_*hab 4 c++ cout c-preprocessor
可以删除所有printf()
使用的呼叫#define printf
.如果我有很多调试打印std::cout << x << endl;
怎么办?如何cout <<
使用预处理器快速关闭单个文件中的语句?
正如"放松"已经说过的那样,快速解决方案是无所事事的流程.但有更好的实现:
class NullStream {
public:
NullStream() { }
template<typename T> NullStream& operator<<(T const&) { return *this; }
};
Run Code Online (Sandbox Code Playgroud)
你仍然有一个小问题,std::cout
因为这是一个三个令牌的序列,你真的不想重新定义std
或cout
单独.一个简单的解决方案
#ifdef NDEBUG
#define COUT std::cout
#else
#define COUT NullStream()
#endif
COUT << "Hello, world" << std::endl;
Run Code Online (Sandbox Code Playgroud)
将调试输出语句替换为如下内容:
IFDBG(cout << result << endl);
Run Code Online (Sandbox Code Playgroud)
然后你可以相应地定义宏:
#ifdef DEBUG
# define IFDBG(x) x
#else
# define IFDBG(x)
#endif
Run Code Online (Sandbox Code Playgroud)
定义这个宏:
#ifdef DEBUG
#define MY_LOG std::cout
#else
#define MY_LOG if(false) std::cout
#endif
Run Code Online (Sandbox Code Playgroud)
这个宏的优势在于编译器优化
如果放置在这些 IF 内的表达式在编译时是常量且可确定的,那么您几乎可以肯定编译器已经将它们从代码中删除... /sf/answers/1026035181/
如果您正在寻找快速删除调试语句的方法,NullStream 可能是一个很好的解决方案。不过,我建议创建您自己的调试类,当需要更多调试功能时,可以根据需要扩展该类:
class MyDebug
{
std::ostream & stream;
public:
MyDebug(std::ostream & s) : stream(s) {}
#ifdef NDEBUG
template<typename T>
MyDebug & operator<<(T& item)
{
stream << item;
return *this;
}
#else
template<typename T>
MyDebug & operator<<(T&)
{
return *this;
}
#endif
};
Run Code Online (Sandbox Code Playgroud)
这是一个简单的设置,可以完成您最初想要的操作,而且它还有一个额外的好处,可以让您添加调试级别等功能。
更新: 现在由于操纵器是作为函数实现的,如果您也想接受操纵器(endl),您可以添加:
MyDebug & operator<<(std::ostream & (*pf)(std::ostream&))
{
stream << pf;
return *this;
}
Run Code Online (Sandbox Code Playgroud)
对于所有操纵器类型(这样您就不必为所有操纵器类型重载):
template<typename R, typename P>
MyDebug & operator<<(R & (*pf)(P &))
{
stream << pf;
return *this;
}
Run Code Online (Sandbox Code Playgroud)
请小心最后一个,因为它也接受常规函数指针。