/Zc:cmath コンパイラ オプションは、<math.h> C ランタイム ヘッダーと <cmath> C++ 標準ライブラリ ヘッダー内の数学関数のランタイム実装を LLVM の libc に置き換えます。 この実装では、すべての丸めモードで正しく丸められた結果が提供されます。
このオプションは、C++ 23 以降で constexpr になる C++ 標準ライブラリの数学関数のコンパイル時評価に必要です。
このオプションは試験段階です。
Syntax
/Zc:cmath
Remarks
<cmath>と<cstdlib>のconstexprと LWG 問題 3834: <cinttypes>のstd::intmax_t数学関数の constexpr が不足しています。提案P0533R9によって C++23 でconstexprになる数学関数のコンパイル時評価には、/std:c++23と共に/Zc:cmathオプションが必要です。
/Zc:cmath オプションは、MSVC ビルド ツール バージョン 14.52 以降で使用できます。 既定ではオフになっています。
このオプションを有効にすると、 <math.h> および <cmath>で宣言された数学関数のパフォーマンスと精度に影響する可能性があります。
/Zc:cmathを使用すると、標準ライブラリ ヘッダーから数学関数を呼び出すときに、C++ ツールセットが自動的にlibvcmath-mt.libまたはlibvcmath-md.libにリンクされます。 これらのライブラリは、結果のバイナリに静的にリンクされます。
Note
システムインクルードディレクティブは山かっこを使用するため、 #include <math.h> は認識されますが、 #include "math.h" は認識されません。
このオプションは、 <math.h> および <stdlib.h> を含むシステムインクルードディレクティブを、標準ライブラリ置換ヘッダーを含むディレクティブに置き換えます。 このオプションは、<math.h>と<stdlib.h>が含まれているため、<cmath>と<cstdlib>に影響します。 置換ヘッダーは、対応する 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-mt.libとlibvcmath-md.libという名前の静的にリンクされたライブラリにこれらの数学関数を実装します。 C++ ビルド ツールは、Windows オペレーティング システムではなく、これらのライブラリをデプロイします。 これらの関数は正しく丸められた結果を返すので、その結果はオペレーティング システムのバージョンとハードウェア アーキテクチャ全体で安定しています。
このコンパイラ オプションを Visual Studio で設定するには
- プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。
- [構成プロパティ]>[C/C++]>[コマンド ライン] プロパティ ページを選択します。
-
/Zc:cmathを [その他のオプション] ペインに追加します。