嗯,我遇到了一个奇怪的问题。
由于将spdlog库添加到我的项目并相应地调整了所有日志输出,因此if-else语句的所有其他块都将被忽略。日志输出已替换为具有简单正则表达式模式(printf样式至fmtlib样式)的搜索和替换过程。
spdlog:https://github.com/gabime/spdlog
经过一些调试之后,我现在编写了以下非常简单的测试函数:
void dbg_test() {
bool success = false;
BOOST_ASSERT_MSG(!success, "Sanity check");
// This works
if (success) {
LOG_ERROR("Successful");
} else {
LOG_ERROR("Unsuccessful"); // Log's written
}
// This doesn't work
if (success)
LOG_ERROR("Successful (w/o)");
else
LOG_ERROR("Unsuccessful (w/o)"); // Log's missing
}
根据“成功”的值,现在发生以下情况(相应地调整了BOOST_ASSERT_MSG):如果将success == true
,“成功”和“成功(w / o)”写入日志。如果success == false
,则写“不成功”,但不写“不成功(无)”。
我当然也检查了日志记录,并希望以exit(0)结束程序而不是写日志,但是此代码也不起作用:
void dbg_test() {
bool success = false;
BOOST_ASSERT_MSG(!success, "Sanity check");
// This works
if (success) {
LOG_ERROR("Successful");
} else {
exit(0);
}
// This doesn't work
if (success)
LOG_ERROR("Successful (w/o)");
else
exit(0);
}
对于编译和调试,我使用Microsoft Visual Studio Community 2017(版本15.5.0)。相应的项目文件夹是使用CMake 3.13.4创建的。
这可能是什么原因?
修改
LOG_ERROR
的宏定义:
#define LOG_ERROR(...) SPDLOG_ERROR(__VA_ARGS__)
答案 0 :(得分:5)
很多精美的代码,但它们无法获得简单的宏。这不是LOG_ERROR宏(我找不到),但是它说明了问题
#define SPDLOG_LOGGER_CALL(logger, level, ...) \
if (logger->should_log(level)) \
logger->log(spdlog::source_loc{SPDLOG_FILE_BASENAME(__FILE__), __LINE__, SPDLOG_FUNCTION}, level, __VA_ARGS__)
应该是
#define SPDLOG_LOGGER_CALL(logger, level, ...) \
do \
if (logger->should_log(level)) \
logger->log(spdlog::source_loc{SPDLOG_FILE_BASENAME(__FILE__), __LINE__, SPDLOG_FUNCTION}, level, __VA_ARGS__) \
while (false)
do ... while
技巧可确保宏的输出可用作简单的语句。对于if语句,您所发现的原始宏输出会弄乱它所发现的任何if ... else
语句,而if语句则不是这样。
也许您可以加入该项目并推动此修复。