好吧,我遇到了一个奇怪的问题。
自从将 spdlog 库添加到我的项目并相应地调整所有日志输出后,我的 if-else 语句的所有其他 block 都被忽略了。日志输出已替换为具有简单正则表达式模式(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
}
根据“success”的值,现在会发生以下情况(相应地调整 BOOST_ASSERT_MSG):如果 success == true
,则将“Successful”和“Successful (w/o)”写入日志。如果success == false
,则写“Unsuccessful”,但不写“Unsuccessful (w/o)”。
当然我也查了日志,想用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__)
最佳答案
很多花哨的代码,但他们无法获得正确的简单宏。这不是 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
语句。
也许您可以加入该项目并推送此修复。
关于C++ - 为什么忽略 if-else-statement 中的 else-statement?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55509290/