我使用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_SEV
是boost::log
提供的工具,而LOG
,LOG_ERROR
,LOG_INFO
,LOG_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
是否有更好的宏定义/技巧可以使预处理器或编译器(在其优化期间)“跳过”或“删除”调试语句{ {1}}设置为MAX_LOG_SEVERITY
常量?
答案 0 :(得分:6)
虽然我无法做出任何保证,但这样的事情可能有用。这取决于您的优化器的作用以及您是否在运算符&lt;&lt;。
的参数中产生副作用。#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
答案 1 :(得分:2)
@ MartinShobe接受的答案适用于:
-O1
及更高-O2
及更高/OPT:REF
答案 2 :(得分:0)
接受的答案对我不起作用(MSVC 2019,stdc++17)。
不过,我的解决方案有点古怪。但是优化肯定会处理它:
#ifdef NDEBUG #define LOG_DEBUG if (false) std::cout #else #define LOG_DEBUG if (true) std::cout #endif
用法:
LOG_DEBUG << ... << std::endl;
答案 3 :(得分:-2)
关闭程序中的所有优化并加快编译速度。
/ OD 或boot_log_stop