C ++-为什么我在if-else语句中的else语句被忽略?

0 c++ if-statement visual-c++

好吧,我遇到了一个奇怪的问题。

由于将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
}
Run Code Online (Sandbox Code Playgroud)

根据“成功”的值,现在会发生以下情况(将相应地调整BOOST_ASSERT_MSG):如果将success == true“成功”和“成功(不包括)”写入日志。如果为success == false,则写“不成功”,但不写“不成功(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);
}
Run Code Online (Sandbox Code Playgroud)

对于编译和调试,我使用Microsoft Visual Studio Community 2017(版本15.5.0)。相应的项目文件夹是使用CMake 3.13.4创建的。

这可能是什么原因?


编辑

的宏定义LOG_ERROR

#define LOG_ERROR(...) SPDLOG_ERROR(__VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)

joh*_*ohn 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__)
Run Code Online (Sandbox Code Playgroud)

应该

#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)
Run Code Online (Sandbox Code Playgroud)

do ... while技巧确保了宏的输出可以用作简单的语句。对于if语句,这不是正确的,正如您发现的那样,原始宏输出将弄乱if ... else它找到的任何语句。

也许您可以加入该项目并推动此修复。