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

use*_*557 15 c++ cout

我经常cout在我的代码中的许多不同位置用于调试目的,然后我感到沮丧并手动评论所有这些.

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

更重要的是,假设我想要抑制所有cout输出,但我仍然希望在终端中看到1个特定输出(假设程序的最终输出).

是否可以使用""其他方式"打印到终端以显示程序输出,然后在抑制cout仍然看到使用这种"其他方式"打印的东西?

use*_*016 62

当然,你可以(例如这里):

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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

First message
Last message
Run Code Online (Sandbox Code Playgroud)

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

  • 很棒的指示! (3认同)

911*_*911 18

要抑制输出,可以断开底层缓冲区与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;
}
Run Code Online (Sandbox Code Playgroud)

  • 它有运行时开销吗? (4认同)

Ric*_*dle 16

不要cout用于调试目的,而是定义调用它的不同对象(或函数或宏),然后可以在一个地方禁用该函数或宏.


iva*_*nyk 5

您可以使用cerr- 标准输出流用于调试目的的错误。

此外,还有clog- 用于记录的标准输出流。

通常,它们的行为都类似于cout.

例子:

cerr << 74 << endl;
Run Code Online (Sandbox Code Playgroud)

详情:http : //www.cplusplus.com/reference/iostream/cerr/

http://www.cplusplus.com/reference/iostream/clog/