【问题标题】:How to get rid of std::cout quickly如何快速摆脱 std::cout
【发布时间】:2015-03-16 08:34:30
【问题描述】:

我继承了一个大型代码库,其中std::cout 经常用于打印调试信息。代码中没有真正的调试/日志功能,因为这将是一个短暂的任务(错误修复),现在实现调试/日志功能是不可能的。

这个程序输出的文本量真的让我很困扰,至少在我必须处理它之前,我想暂时禁用所有打印输出。

我现在看到了两种解决方案:

  1. 只需将它们注释掉...这需要大量工作,因为某些 std::couts 跨越多行,所以我必须手动找到它们
  2. 将所有出现的std::cout 替换为具有自己的operator << 并简单地吞下所有输出的构造

对于这个问题你有更好的解决方案吗?

【问题讨论】:

  • 为什么不用调用日志函数/方法来替换所有这些控制台打印?然后,您可以根据各种条件在单个位置启用/禁用打印(例如仅启用调试,或在用户选择此选项时启用等)。
  • #ifdef DEBUG std::cout << ... #endif
  • @MariusBancila 在这个项目中没有实现日志功能......原来的高薪承包商/顾问认为它不重要/无关紧要
  • 好吧,它最初的样子并不重要。如果你想做点什么,那就做对的事。
  • @fritzone:这不是重点 - 如果您更改 cout 语句以调用某个宏,您可以先进行无操作(什么也不做)宏替换,然后如果您想替换花时间在一些增强的日志记录上(例如滚动固定大小的文件、历史管理、通过 TCP 进行日志记录、系统服务等),您可以更新所有日志记录都经过的单个宏。

标签: c++ debugging cout


【解决方案1】:

您可以使用类似的方式以编程方式重定向标准输出

FILE origSTDOUT = *stdout;
static FILE* nul = fopen( "NUL", "w" );
*stdout = *nul;
setvbuf( stdout, NULL, _IONBF, 0 );

从你想抑制输出并使用类似的东西恢复

*stdout = origSTDOUT;

恢复它。

【讨论】:

  • 这正是我所需要的。通过将它包装在一些全局方法中,它完全按照预期的方式工作。在我完成对代码的更改后,它也有一个非常简单的“干净”过程。
  • @fritzone 我没有做的是恢复缓冲区。您可能想要这样做,或者如果它是为了快速而肮脏的黑客攻击。
  • 这只是快速而肮脏的代码,不会投入生产,只是为了本地调试而不会丢失所有其他输出。谢谢:)
【解决方案2】:

从应用程序内部

如果您想从应用程序本身执行此操作,您可以更改 std::cout 的底层 std::streambuf,以便任何输出有效地在其他地方结束。


示例

std::ostringstream buffer;
std::streambuf * cout_streambuf = std::cout.rdbuf (buffer.rdbuf ()); // (A)

std::cout << "hello world\n";                                        // (B) 

std::cout.rdbuf (orig_cout_streambuf);                               // (C)
  • (A) 会将std::cout 的底层streambuf 设置为buffer 的底层streambuf,并返回旧的streambuf(有效地初始化cout_streambuf 使用此值)。
  • (B) 写入一些数据,有效地使其最终出现在我们的std::ostreamstream
  • (C) 重置底层streambuf,恢复到之前的状态


注意(B) 表示您希望在其中拥有“重定向 std::cout”的应用程序部分.



使用 shell 重定向

您可以使用 shell 提供的工具,而不是弄乱应用程序本身,只需将输出重定向到 STDOUT/dev/null 或等效项(有效地丢弃它)


*NIX

./binary > /dev/null # send STDOUT to /dev/null


WINDOWS

./binary > NUL       # send STDOUT to NUL

【讨论】:

    【解决方案3】:

    这个:

    std::cout.rdbuf(nulllptr);
    

    禁用任何输出。只需将其添加到 main.

    【讨论】:

      【解决方案4】:

      您可以将标准输出重定向到空文件。因此,输出变得不可见。在 Unix 系统中,您可以像这样运行程序:program_name &gt; /dev/null 在控制台上。对于windows,可以试试program_name &gt; nul

      【讨论】:

      • 是的,确实,这是一个可行的解决方案,但如果想打印出我想看到的东西怎么办?
      猜你喜欢
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 2015-04-27
      • 2014-01-28
      • 2013-10-31
      • 2020-10-19
      • 2019-12-01
      相关资源
      最近更新 更多