使用预处理器取消std :: cout代码行

jac*_*hab 4 c++ cout c-preprocessor

可以删除所有printf()使用的呼叫#define printf.如果我有很多调试打印std::cout << x << endl;怎么办?如何cout <<使用预处理器快速关闭单个文件中的语句?

MSa*_*ers 9

正如"放松"已经说过的那样,快速解决方案是无所事事的流程.但有更好的实现:

class NullStream {
    public:
    NullStream() { }
    template<typename T> NullStream& operator<<(T const&) { return *this; }
};
Run Code Online (Sandbox Code Playgroud)

你仍然有一个小问题,std::cout因为这是一个三个令牌的序列,你真的不想重新定义stdcout单独.一个简单的解决方案

#ifdef NDEBUG
    #define COUT std::cout
#else
    #define COUT NullStream()
#endif

COUT << "Hello, world" << std::endl;
Run Code Online (Sandbox Code Playgroud)


Pau*_*ams 6

作为一般原则,应该避免记录到stdout - 更好地记录到日志文件,然后您可以使用标准配置工具来更改日志级别,或者完全关闭它.

只需我0.02美元.....


Fer*_*yer 5

将调试输出语句替换为如下内容:

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)


y30*_*y30 5

定义这个宏:

#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/


Ram*_* B. 4

如果您正在寻找快速删除调试语句的方法,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)

请小心最后一个,因为它也接受常规函数指针。