如何重载printf或cout

nod*_*nja 6 c++ debugging function

我在程序中使用cout语句进行调试.我想创建一个像它一样工作的函数,或者像printf一样工作,但是对全局变量很敏感.如果此全局变量为true,则它将打印到屏幕.如果它是假的,那么它将不会打印任何东西.是否已经有这样的功能?如果没有,那怎么可以呢?

sho*_*osh 5

像这样的东西:

int myPrintf(const char* format, ...) 
{
  if (globalCheck == 0)
    return 0
  va_list vl;
  va_start(vl, format);
  auto ret = vprintf(format, vl);
  va_end(vl);
  return ret;
}
Run Code Online (Sandbox Code Playgroud)

va_startva_end接受参数...并将它们封装在一个va_list.有了它,va_list你就可以根据这个需要设计vprintf一个变体printf.

旁注 - 通常使用全局变量是不好的做法.更好的办法是将它封装在这样的类中 -

class ConditionalPrinter {
public:
  ConditionalPrinter() : m_enable(true) {}
  void setOut(bool enable) { m_enable = enable; }
  int myPrintf(const char* format, ...);
private:
  bool m_enable;
}
Run Code Online (Sandbox Code Playgroud)

然后检查m_enable而不是全局变量.使用方法如下:

ConditionalPrinter p;
p.myPrintf("hello %d", 1);   // printed
p.setOut(false);
p.myPrintf("hello2 %d", 1);  // not printed
Run Code Online (Sandbox Code Playgroud)

....