(可选)在运行时打印到stdout

时间:2014-12-11 15:12:19

标签: c++ stdout

我在C ++程序中输出,我只想查看"详细"选项在运行时指定。我发现很多方法在编译时使用预处理器#define语句来控制调试输出,但我无法在运行时找到任何方法来执行此操作,而不是将每个cout包装起来if(verbose)

在伪代码中,我想改造:

if(verbose)
  cout << "Some text: " << variable << endl;
...
if(verbose)
  cout << "Other text: " << var << endl;

分为:

if(verbose)
  //block cout

cout << "Some text: " << variable << endl;
cout << "Other text: " << var << endl;

有没有办法在运行时重新定义cout,以便这些行无声地打印出来?更好的是,这将是一种更灵活的方法,允许一些输出,同时阻止其他输出。

2 个答案:

答案 0 :(得分:2)

您可以根据verbose简单地将流对象引用绑定到不同的流:

ostream& vout = (verbose? cout : nullstream);

然后使用vout表示只应在verbose时显示的所有输出。

当然,您需要先定义nullstream;涉及defining a streambuf derived class

答案 1 :(得分:0)

我不确定您是否正在编写程序,或者您是否已经拥有要禁用输出的程序。通常,当您使用调试输出编写软件时,您将要创建某种日志记录类,以帮助您控制输出何时发生以及何时发生(例如,到文件,到stdout,到stderr)等)。一个简单的例子是:

#include <iostream>

class Logger {

public:
    Logger(bool enabled) : enabled(enabled) { }
    void setEnabled(bool enabled) { this->enabled = enabled; }

    template<typename T> Logger& operator<<(T const& t)
    {
        if (enabled)
            std::cout << t;
        return *this;
    }

    // If you'd like manipulator support (e.g., for std::endl)
    Logger& operator<<(std::ostream& (*manipulator)(std::ostream&))
    {
        if (enabled)
            std::cout << manipulator;
        return *this;
    }

private:
    bool enabled;
};

int main()
{
    Logger log(true);
    log << "Hello, " << "World!" << 123; // Prints Hello, World!123

    log.setEnabled(false);
    log << "Hello, " << "World!" << 123; // Prints nothing
}

或者,您可以像其他人提到的那样重定向cout,或者甚至只是简单地将程序的输出重定向到命令行上的/ dev / null:

./myProgram > /dev/null