gpt4 book ai didi

c++ - 将调试输出重定向到空流而不是 std::cerr

转载 作者:太空狗 更新时间:2023-10-29 20:13:52 30 4
gpt4 key购买 nike

我正在使用的软件库将大量调试输出写入 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++,因此任何替代解决方案都不应使用特定于编译器的内容

最佳答案

没有必要担心流不是good()!由于输出运算符在故障模式下不会真正对流执行任何操作,因此记录的不同实体不会被格式化,即,与替代方法相比,代码确实运行得更快。

请注意,您实际上并不需要第二个流来禁用输出:

  1. 假设所有的输出运算符都表现良好,您可以设置 std::ios_base::failbit:

    debugStream().setstate(std::ios_base::failbit);
  2. 如果存在写入流的异常输出,即使它不是good(),您也可以将其流缓冲区设置为空:

    调试流().rdbuf(nullptr);

如果您真的希望您的流保持在good() 状态,您可以安装一个只消耗字符的流缓冲区。但是请注意,您希望为该流缓冲区提供一个缓冲区,因为为每个 char 调用 overflow() 是相当昂贵的:

struct nullbuf
: std::streambuf {
char buf[256];
int overflow(int c) {
this->setp(this->buf, this->buf + 256);
return std::char_traits<char>::not_eof(c);
}
};
...
nullbuf sbuf;
debugStream().rdbuf(&sbuf);
...
debugStream().rdbuf(0);

有必要重置流的流缓冲区,因为 std::ostream 的析构函数将刷新 stresm 缓冲区(即,它调用 pubsync())。在被破坏的流缓冲区上这样做是行不通的。

就我个人而言,我会选择设置 std::ios_base::failbit

关于c++ - 将调试输出重定向到空流而不是 std::cerr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19200207/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com