如何快速摆脱 std::cout
How to get rid of std::cout quickly
我继承了一个大型代码库,其中 std::cout
经常用于打印调试信息。代码中没有真正的 debug/log 功能,因为这将是一个短暂的任务(错误修复),现在实现 debug/log 功能是不可能的。
我真的很困扰这个程序输出的文本量,至少在我必须处理它之前我想暂时禁用所有打印输出。
我现在看到两个解决方案:
- 只需将它们注释掉...这是很多工作,因为一些
std::couts
跨越多行,所以我必须手动找到它们
- 将
std::cout
的所有出现替换为具有自己的 operator <<
的构造,并简单地吞下所有输出
对于这个问题,你有更好的解决方案吗?
您可以将标准输出重定向到空文件。因此,输出变得不可见。在 Unix 系统中,您可以像这样 运行 您的程序: program_name > /dev/null
在控制台上。对于 windows,您可以尝试 program_name > nul
您可以使用类似
的方式以编程方式重定向标准输出
FILE origSTDOUT = *stdout;
static FILE* nul = fopen( "NUL", "w" );
*stdout = *nul;
setvbuf( stdout, NULL, _IONBF, 0 );
从您想抑制输出并使用类似
恢复的点开始
*stdout = origSTDOUT;
恢复它。
从应用程序内部
如果您想从应用程序本身执行此操作,您可以更改 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,并且 return旧的streambuf(有效地用这个值初始化cout_streambuf)。
- (B) 写入一些数据,有效地使其最终进入我们的
std::ostreamstream
- (C) 重置底层 streambuf,恢复到之前的状态
Note: (B) represents the part of your application where you'd like to have a "redirected std::cout".
使用 shell 重定向
您可以使用 shell 提供的工具,而不是弄乱应用程序本身,只需将输出重定向到 STDOUT 到 /dev/null
或等价物(有效地丢弃它)
*NIX
./binary > /dev/null # send STDOUT to /dev/null
WINDOWS
./binary > NUL # send STDOUT to NUL
这个:
std::cout.rdbuf(nulllptr);
禁用任何输出。只需将其添加到 main.
我继承了一个大型代码库,其中 std::cout
经常用于打印调试信息。代码中没有真正的 debug/log 功能,因为这将是一个短暂的任务(错误修复),现在实现 debug/log 功能是不可能的。
我真的很困扰这个程序输出的文本量,至少在我必须处理它之前我想暂时禁用所有打印输出。
我现在看到两个解决方案:
- 只需将它们注释掉...这是很多工作,因为一些
std::couts
跨越多行,所以我必须手动找到它们 - 将
std::cout
的所有出现替换为具有自己的operator <<
的构造,并简单地吞下所有输出
对于这个问题,你有更好的解决方案吗?
您可以将标准输出重定向到空文件。因此,输出变得不可见。在 Unix 系统中,您可以像这样 运行 您的程序: program_name > /dev/null
在控制台上。对于 windows,您可以尝试 program_name > nul
您可以使用类似
的方式以编程方式重定向标准输出FILE origSTDOUT = *stdout;
static FILE* nul = fopen( "NUL", "w" );
*stdout = *nul;
setvbuf( stdout, NULL, _IONBF, 0 );
从您想抑制输出并使用类似
恢复的点开始*stdout = origSTDOUT;
恢复它。
从应用程序内部
如果您想从应用程序本身执行此操作,您可以更改 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,并且 return旧的streambuf(有效地用这个值初始化cout_streambuf)。 - (B) 写入一些数据,有效地使其最终进入我们的
std::ostreamstream
- (C) 重置底层 streambuf,恢复到之前的状态
Note: (B) represents the part of your application where you'd like to have a "redirected std::cout".
使用 shell 重定向
您可以使用 shell 提供的工具,而不是弄乱应用程序本身,只需将输出重定向到 STDOUT 到 /dev/null
或等价物(有效地丢弃它)
*NIX
./binary > /dev/null # send STDOUT to /dev/null
WINDOWS
./binary > NUL # send STDOUT to NUL
这个:
std::cout.rdbuf(nulllptr);
禁用任何输出。只需将其添加到 main.