我们有可以在 silence mode
运行的守护进程和 print mode
(打印到 std::cout)。如何制作silence
没有开销和 io 调用。建议更多更好的方法!或者写什么方法比较好! (优点/缺点)
例如:
1 种方式:
简单的地方在代码std::cout << "blah-blah-blah: " << var << std::endl;
什么时候需要沉默close(STDOUT_FILENO)
或将 cout 重写为 dev/null
(如何?)
2 路
使用 global bool FLAG_SILENCE
并在每次 cout 调用之前检查它:if (!FLAG_SILENCE) std::cout << "blah-blah-blah: " << var << std::endl;
3 路
预定义宏 #define SILENTCOUT std::cout
什么时候需要沉默#define SILENTCOUT SOMETHING
(something = some function that have operator <<
and without overhard (does not know how to realise, seems need to define our own function with defined
<<` that do nothing )
4 路
预定义宏 #define SILENTCOUT(x) std::cout << x << std::endl
使用 SILENTCOUT( "mess" )
-- 危险,非常丑陋
最佳答案
一个常见的解决方案是提供包含 if
的宏。和实际打印:
#define LOG( msg ) \
if ( !log_enabled ) {} else \
std::cout << msg;
虽然一般来说宏有点复杂(例如,不是测试 log_enabled
而是采用日志级别,将其与预定义级别进行比较并相应地记录)。
一些库使用宏选项返回一个实现了operator<<
的记录器对象。并且根据配置将提供适当的记录器或仅忽略参数的无操作接收器。这可能会稍微降低性能,因为这至少需要函数调用 operator<<
.
无论如何,我建议您使用日志记录库,因为这些问题已经多次 解决了。
关于c++ - cpp 建议在没有开销/io 调用的情况下进入静音状态的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10959573/