如何在运行时禁用 cout 输出?
How to disable cout output in the runtime?
我经常在我的代码的许多不同地方使用 cout
进行调试,然后我感到沮丧并手动注释所有这些。
有没有办法在运行时抑制 cout 输出?
更重要的是,假设我想抑制所有 cout
输出,但我仍然希望在终端中看到 1 个特定输出(假设程序的最终输出)。
是否可以使用打印到终端的“"other way"”来显示程序输出,然后在抑制 cout 时仍然看到使用此“"other way"”打印的内容?
您可以使用 cerr
- 错误的标准输出流以进行调试。
此外,还有 clog
- 用于日志记录的标准输出流。
通常,它们的行为都像 cout
。
示例:
cerr << 74 << endl;
不要将 cout
用于调试目的,而是定义一个调用它的不同对象(或函数或宏),然后您可以在一个地方禁用该函数或宏。
当然可以 (example here):
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 被清除。
您似乎打印了调试消息。您可以在 Visual C++/MFC 中使用 TRACE,或者您可能只想创建一个 Debug()
函数来处理它。您可以将其实现为仅在设置了不同的标志时才打开。例如,许多程序使用名为 verbose
或 -v
的命令行参数来控制其日志和调试消息的行为。
要抑制输出,您可以断开基础缓冲区与法院的连接。
#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
的文件,您可能希望在开头(在 main 之外)编写代码,可以这样做:
struct Clearer {
Clearer() { std::cout.setstate(std::ios::failbit); }
} output_clearer;
我经常在我的代码的许多不同地方使用 cout
进行调试,然后我感到沮丧并手动注释所有这些。
有没有办法在运行时抑制 cout 输出?
更重要的是,假设我想抑制所有 cout
输出,但我仍然希望在终端中看到 1 个特定输出(假设程序的最终输出)。
是否可以使用打印到终端的“"other way"”来显示程序输出,然后在抑制 cout 时仍然看到使用此“"other way"”打印的内容?
您可以使用 cerr
- 错误的标准输出流以进行调试。
此外,还有 clog
- 用于日志记录的标准输出流。
通常,它们的行为都像 cout
。
示例:
cerr << 74 << endl;
不要将 cout
用于调试目的,而是定义一个调用它的不同对象(或函数或宏),然后您可以在一个地方禁用该函数或宏。
当然可以 (example here):
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 被清除。
您似乎打印了调试消息。您可以在 Visual C++/MFC 中使用 TRACE,或者您可能只想创建一个 Debug()
函数来处理它。您可以将其实现为仅在设置了不同的标志时才打开。例如,许多程序使用名为 verbose
或 -v
的命令行参数来控制其日志和调试消息的行为。
要抑制输出,您可以断开基础缓冲区与法院的连接。
#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
的文件,您可能希望在开头(在 main 之外)编写代码,可以这样做:
struct Clearer {
Clearer() { std::cout.setstate(std::ios::failbit); }
} output_clearer;