我使用boost::log作为我的C ++程序的记录器。 在开发过程中,我经常以这种方式使用它,例如:

#define LOG(severity) BOOST_LOG_SEV(boost::logger::get(), (severity))
#define LOG_ERR LOG(Severity::error)
#define LOG_INFO LOG(Severity::info)
#define LOG_DEBUG LOG(Severity::debug)

其中BOOST_LOG_SEVboost::log提供的工具,而LOGLOG_ERRORLOG_INFOLOG_DEBUG是我定义的快捷方式。

简而言之, BOOST_LOG_SEV动态地将当前调试严重性与传递给宏本身的严重性进行比较,以决定是否发出输出。

这是一个使用上述宏进行调试的程序示例:

// set at compile time
#define MAX_LOG_SEVERITY Severity::debug

int main() {
   // Print all the messages with a
   // Severity <= MAX_LOG_SEVERITY defined before compiling
   boost::log::set_severity(boost::logger::get(), MAX_LOG_SEVERITY); // set_severity() is fictitious just to give you an idea

   // bool err = ...
   if (err)
      LOG_ERR << "An error occurred";
   else 
      LOG_INFO << "Okay;
   LOG_DEBUG << "main() called";
}

现在,在为生产环境发布程序时,使用Severity::debug级别调试消息确实没有意义。 我可以通过简单地将MAX_LOG_SEVERITY减少到Severity::info来隐藏它们,但问题是LOG_DEBUG所做的调用不会从可执行代码中删除。 这对效率和对象大小都有不良影响。

代码中充满了日志语句,我真的很想保留operator<<()的简单使用。

在没有触及那些语句本身的情况下, LOG_DEBUG是否有更好的宏定义/技巧,当MAX_LOG_SEVERITY设置为Severity::debug时,会使预处理器或编译器(在其优化期间)“跳过”或“删除”调试语句Severity::debug常量?

===============>>#1 票数:6 已采纳

虽然我无法做出任何保证,但这样的事情可能有用。 这取决于你的优化器的作用以及你是否在operator <<的参数中有副作用。

#ifdef NO_LOG_DEBUG

static class DevNull
{
} dev_null;

template <typename T>
DevNull & operator<<(DevNull & dest, T)
{
    return dest;
}

#define LOG_DEBUG dev_null

#else

#define LOG_DEBUG LOG(Severity::debug)

#endif

===============>>#2 票数:2

@ MartinShobe接受的答案适用于:

  • 带有-O1和更高版本的g ++(4.7.2)
  • clang ++(3.4)与-O2和更高
  • Visual Studio(2008),带有链接器标志/OPT:REF

===============>>#3 票数:-2

关闭程序中的所有优化并加快编译速度。

/ od或boot_log_stop

  ask by Martin translate from so

未解决问题?本站智能推荐: