我正在使用的软件库将大量调试输出写入std::cerr
,但如果我告诉它保持安静,则将该输出重定向到空流。这是一个简化main.cpp
,显示了代码如何尝试实现这一点:
#include <iostream>
#include <fstream>
#include <cassert>
// The stream that debug output is sent to. By default
// this points to std::cerr.
std::ostream* debugStream(&std::cerr);
// Throughout the library's codebase this function is called
// to get the stream that debug output should be sent to.
std::ostream& DebugStream()
{
return *debugStream;
}
// Null stream. This file stream will never be opened and acts
// as a null stream for DebugStream().
std::ofstream nullStream;
// Redirects debug output to the null stream
void BeQuiet()
{
debugStream = &nullStream;
}
int main(int argc, char** argv)
{
DebugStream() << "foo" << std::endl;
BeQuiet();
DebugStream() << "bar" << std::endl;
assert(debugStream->good());
return 0;
}
运行此程序时,您会注意到字符串“bar”已正确发送到空流。但是,我注意到断言失败了。这是我应该关心的事情吗?或者这只是库开发人员选择的方法的一个略显丑陋的细节?
如果您愿意,欢迎提出更好的替代方案。一些限制:
- 该库是跨平台的,所以我认为使用打开
/dev/null
不是一个有效的解决方案,因为它不适用于 Windows - 该库使用标准 C++,因此任何替代解决方案都不应使用特定于编译器的东西