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

时间:2019-04-04 06:34:51

标签: 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
}

根据“成功”的值,现在发生以下情况(相应地调整了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__)

1 个答案:

答案 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语句则不是这样。

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