[英]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.