簡體   English   中英

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

[英]C++ - Why is my else-statement in an if-else-statement ignored?

好吧,我遇到了一個奇怪的問題。

由於將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 ,則將“成功”和“成功(不包括)”寫入日志。 如果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__)

有很多花哨的代碼,但它們無法獲得簡單的宏。 這不是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語句。

也許您可以加入該項目並推動此修復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM