我在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,以便这些行无声地打印出来?更好的是,这将是一种更灵活的方法,允许一些输出,同时阻止其他输出。
答案 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