它通过使用一些宏/预处理器魔法来工作。这些语句看起来确实像对某些函数的调用operator<<()
:
BOOST_LOG_TRIVIAL(warning) << expensive();
然而,简化了很多,宏的工作方式就好像我们写了类似的东西:
if (level == warning)
logger << expensive();
如果您想简化该代码以避免一直编写,您可以定义如下宏:
#define LOG_WARNING if (level == warning) logger
然后我们可以将其用作:
LOG_WARNING << expensive();
实际上BOOST_LOG_TRIVIAL https://github.com/boostorg/log/blob/boost-1.67.0/include/boost/log/trivial.hpp#L112宏最终扩展为:
for (
::boost::log::record _boost_log_record_N =
(::boost::log::trivial::logger::get()).open_record(
(::boost::log::keywords::severity = ::boost::log::trivial::error)
)
;
!!_boost_log_record_N;
)
::boost::log::aux::make_record_pump(
(::boost::log::trivial::logger::get()),
_boost_log_record_N
).stream() << expensive();
如您所见,取决于!!_boost_log_record_N
循环条件(这又取决于结果open_record()
),循环体将运行零次或多次;这就是为什么expensive()
并不总是运行。