簡體   English   中英

瑣碎的 C++ 代碼在測試項目中通過並在主要項目中失敗

[英]Trivial C++ code passes in a test project and fails in the main one

這兩行微不足道的代碼:

const bool equal = (HUGE_VALF == HUGE_VALF);
static_assert(equal == true, "Fatal error");

在測試程序中完美運行(沒有警告也沒有錯誤)。

當我在主項目中復制它們時,我在斷言中收到此錯誤:

錯誤 C2057:預期的常量表達式

這里的equal對象是一個 value = true的常量。

這些代碼行在兩種情況下都在函數內部。

這兩個項目具有相同的設置(C++11、Visual C++ 2013 編譯器、Visual C++ 2019 IDE、/W4、無優化)。

與編譯器不同的行為可能是什么原因?

當較新的 Visual Studio IDE(如 VS 2019)首次加載較舊的項目時,它會要求重新定位項目。 如果您安裝了舊的 Visual Studio,您可以拒絕此操作。 然后,較新的 IDE 將使用來自原始 VS 的編譯器。

加載解決方案后,在項目名稱旁邊的解決方案資源管理器中,您將擁有用於編譯項目的 Visual Studio。 如果缺少括號,則意味着使用了當前 Visual Studio 中的編譯器和標准庫。

正如評論中提到的:

項目名稱后沒有括號(如果我找對了地方)。 但是,我意識到包含文件路徑中的問題:Test Project: 14.24.28314\\include\\cmath; 主要項目: Microsoft Visual Studio 12.0\\VC\\include\\cmath ,即一個更舊的版本,其內部仍然依賴於 C math.h 頭文件。 所以,相同的編譯器(VS2013),不同的庫......

這表明您很可能在 VS 2019 中重新定位了項目或創建了一個新項目。

要在 VS 2019 中使用舊編譯器創建項目,您需要進入項目屬性 -> 配置屬性 -> 常規 -> 平台工具集並將其更改為適當的 Visual Studio。

還要確保所有機器類型(32 位、64 位)的所有配置(調試、發布等)具有相同的設置值。

因為測試項目使用的是 VS 2019 - 它具有所有必需的定義 - 所以它可以工作。

所以問題很可能是,VS 2013 標准庫不是 C++11 完整的,並且沒有HUGE_VALF的定義。 但它可能包含HUGE_VAL的定義

暫無
暫無

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

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