C++ - 为什么忽略 if-else-statement 中的 else-statement?

标签 c++ if-statement visual-c++

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

自从将 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/

相关文章:

java - 尝试将 if-else 语句转换为 switch 语句,但最终出现错误

java - Android 中未返回 if 语句返回值

javascript - 如何重构这一堆 if 语句?

c++ - 关于streambuf溢出函数的查询

c++ - 为什么我们不在 STL 的迭代器中传递星号 (*)

c++ - clion 在每个构建上运行 cmake

c++ - 在 OpenCV 中为我检测到的对象制作动画

c++ - 从文本文件读取到数组

C++ LNK1120 和 LNK2019 错误 : "unresolved external symbol WinMain@16"

c++ - 在 C++ 中为基于文本的杆位游戏移动汽车时遇到问题