我经常在代码中的各个地方使用 cout
进行调试,但是后来会感到沮丧并手动注释所有的输出。
有没有办法在运行时抑制 cout
的输出?
更重要的是,假设我想要抑制所有 cout
的输出,但仍然想在终端上看到一个特定的输出(比如程序的最终输出)。
是否可以使用一种“其他方式”将程序输出打印到终端,并在抑制 cout
时仍然能够看到使用这种“其他方式”打印的内容?
当然可以,这里有一个示例:
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被清除。
#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;
}
不要使用cout
进行调试,而是定义一个不同的对象(或函数、宏),然后通过它来调用cout
。这样,您可以在一个地方禁用该函数或宏。
你可以使用cerr
- 标准错误输出流来进行调试。
同时,还有clog
- 用于日志的标准输出流。
通常情况下,它们都像cout
一样表现。
例如:
cerr << 74 << endl;
cout
的文件,你可能想要将代码写在开头(main函数之外),可以像这样实现:struct Clearer {
Clearer() { std::cout.setstate(std::ios::failbit); }
} output_clearer;
看起来你正在打印调试信息。你可以在Visual C++/MFC中使用TRACE,或者你可能想创建一个Debug()
函数来处理它。你可以实现它,只有在设置了特定标志时才打开。许多程序使用一个命令行参数,例如verbose
或-v
,来控制其日志和调试消息的行为。