【发布时间】:2019-12-13 23:29:48
【问题描述】:
我有一个 C++ 类,它将消息记录到 std::ofstream。在类定义中是这样的代码:
#ifdef NDEBUG
#define FOO_LOG(msg) /* calls to log messages are no-op in release mode */
#else
std::ofstream log_stream;
#define FOO_LOG(msg) if (log_stream.is_open()) { log_stream << msg << std::endl; }
#endif
该类的构造函数会检查几项内容,并且在某些情况下会打开类似于以下内容的日志文件:
#ifndef NDEBUG
log_stream.open("output.log");
#endif
然后在代码中,它像这样调用 C 宏:
FOO_LOG("stuff=" << stuff << " in loop counter #" << xyz)
您可以将多个参数传递给FOO_LOG() 宏,这很方便。有明显的限制,例如在记录来自多个线程的消息时,但这仅用于在调试版本中进行简单的记录。
我想知道的是在 C++ 中是否有不同/更好的方法来处理 msg 参数? 有没有更简单/更干净的方法来实现类似于 FOO_LOG() 的东西在 C++ 中?
【问题讨论】:
-
是的。类似
FOO_LOG(logLevel) << "stuff=" << stuff << " in loop counter #" << xyz;。 -
C++11 及更高版本,您可以使用带有参数包或可变参数宏的模板化函数
-
@S.M.将您的评论变成答案,以便人们对其发表评论。我不明白你写的东西怎么可能编译。
-
@Stéphane “类似的东西”是什么意思?您想在调用站点维护语法吗?我猜想将整个事情实现为一个名为
FOO_LOG("stuff=", stuff, " in loop counter #", xyz)的函数模板,或者以 S.M. 的方式实现。建议可以完全删除宏并使其更清洁。