/Zc:cmath (啟用 libc 數學)

/Zc:cmath編譯器選項將 C 執行時標頭與 <cmath> C++ 標準函式庫標頭中的數學函<math.h>式實作替換為 LLVM 的 libc。 此實作在所有四捨五入模式中都能提供正確的四捨五入結果。

你需要這個選項來進行編譯時評估 C++ 標準函式庫的數學函式,這些函式會成為 constexpr C++23 或更新版本。

這個選項還只是實驗性質。

Syntax

/Zc:cmath

Remarks

你需要一個/Zc:cmath選項,以及 /std:c++23,才能在編譯時評估 C++23 中由constexpr提案 P0533R9 constexpr 和 <cstdlib>和 <cmath> 的數學函數。第 3834 期:缺少數學函<cinttypes>數的 std::intmax_t constexpr。

/Zc:cmath此選項自 MSVC 建置工具 14.52 版本起提供。 預設情況下它是關閉的。

啟用此選項可能會影響 和 <cmath>中宣告<math.h>的數學函數的效能與準確度。

當你使用 /Zc:cmath時,C++ 工具組會自動連結 libvcmath-mt.lib 或 libvcmath-md.lib 在標準函式庫標頭呼叫數學函式時。 這些函式庫會靜態連結到產生的二進位檔中。

Note

系統包含指令使用角括號,因此 #include <math.h> 被識別但 #include "math.h" 不被識別。

此選項取代系統 <math.h> 包含的指令,與 <stdlib.h> 包含標準函式庫替換標頭的指令相連。 該選項影響 <cmath> 和 <cstdlib> ,因為它們包含 <math.h> 和 <stdlib.h>。 替換標頭與對應的 UCRT 標頭有以下差異:

  • 數學函數定義為 noexcept,與非 noexcept的宣告衝突。 參見 C2382。 可能的修正方法包括移除不必要的前置聲明,或是在前置聲明中新增 noexcept 。

  • 不包含 C++ 標準的函式與巨集定義。 此排除包括 數學常數,例如 M_PI。 <numbers>標準函式庫標頭提供對應變數的符合標準定義。 若要繼續使用這些數學常數,請直接包含 <corecrt_math_defines.h>。 _USE_MATH_DEFINES 使用時不會有影響 /Zc:cmath。

Background

預設情況下,通用 C 執行時(UCRT)實作了在 <math.h> 和 <cmath>中宣告的數學函式。 Windows 維護並部署 UCRT,因此數學函數的結果會因 Windows 版本而異。

當你啟用 /Zc:cmath時,LLVM 的 libc 會以靜態連結的函式庫 和 libvcmath-md.lib實現這些數學libvcmath-mt.lib函式。 C++ 建置工具部署這些函式庫,而非 Windows 作業系統。 由於這些函式回傳的結果是四捨五入的,因此其結果在作業系統版本與硬體架構間都相當穩定。

在 Visual Studio 中設定此編譯器選項

  1. 開啟專案的 [屬性頁] 對話方塊。 如需詳細資料,請參閱在 Visual Studio 中設定 C ++ 編譯器和組建屬性。
  2. 選取 [組態屬性]>[C/C++]>[命令列] 屬性頁。
  3. 新增/Zc:cmath選項:面板。

另請參閱

/Zc (一致性)
/std (指定語言標準版本)
數學常數