如何在运行时禁用cout输出?

31

我经常在代码中的各个地方使用 cout 进行调试,但是后来会感到沮丧并手动注释所有的输出。

有没有办法在运行时抑制 cout 的输出?

更重要的是,假设我想要抑制所有 cout 的输出,但仍然想在终端上看到一个特定的输出(比如程序的最终输出)。

是否可以使用一种“其他方式”将程序输出打印到终端,并在抑制 cout 时仍然能够看到使用这种“其他方式”打印的内容?

6个回答

95

当然可以,这里有一个示例

int main() {
    std::cout << "First message" << std::endl;

    std::cout.setstate(std::ios_base::failbit);
    std::cout << "Second message" << std::endl;

    std::cout.clear();
    std::cout << "Last message" << std::endl;

    return 0;
}

输出:

First message
Last message

这是因为将流置于fail状态会使其静默丢弃任何输出,直到failbit被清除。


29
为了抑制输出,您可以从cout中断开底层缓冲区。
#include <iostream>

using namespace std;

int main(){

    // get underlying buffer
    streambuf* orig_buf = cout.rdbuf();

    // set null
    cout.rdbuf(NULL);

    cout << "this will not be displayed." << endl;

    // restore buffer
    cout.rdbuf(orig_buf);

    cout << "this will be dispalyed." << endl;

    return 0;
}

4
它有运行时开销吗? - abhiarora

21

不要使用cout进行调试,而是定义一个不同的对象(或函数、宏),然后通过它来调用cout。这样,您可以在一个地方禁用该函数或宏。


5

1
如果你包含了涉及cout的文件,你可能想要将代码写在开头(main函数之外),可以像这样实现:
struct Clearer {
    Clearer() { std::cout.setstate(std::ios::failbit); }
} output_clearer;

0

看起来你正在打印调试信息。你可以在Visual C++/MFC中使用TRACE,或者你可能想创建一个Debug()函数来处理它。你可以实现它,只有在设置了特定标志时才打开。许多程序使用一个命令行参数,例如verbose-v,来控制其日志和调试消息的行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接