/Zc:cmath (Włącz matematykę libc)

Opcja /Zc:cmath kompilatora zastępuje implementację środowiska uruchomieniowego funkcji matematycznych w <math.h> nagłówku środowiska uruchomieniowego języka C i <cmath> nagłówku standardowej biblioteki języka C++ biblioteką libc llVM. Ta implementacja zapewnia poprawne zaokrąglenie wyników we wszystkich trybach zaokrąglania.

Ta opcja jest potrzebna do obliczania w czasie kompilacji standardowych funkcji matematycznych biblioteki języka C++, które stają się constexpr w języku C++23 lub nowszym.

Ta opcja jest eksperymentalna.

Syntax

/Zc:cmath

Remarks

Potrzebna jest /Zc:cmath opcja wraz z opcją /std:c++23, w przypadku obliczania w czasie kompilacji funkcji matematycznych, które stają się constexpr w języku C++23 przez propozycję P0533R9: for <cmath> i <cstdlib>LWG Problem 3834: constexprBrak constexpr dla std::intmax_t funkcji matematycznych w programie <cinttypes>.

Opcja /Zc:cmath jest dostępna począwszy od narzędzi MSVC Build Tools w wersji 14.52. Domyślnie jest wyłączona.

Włączenie tej opcji może mieć wpływ na wydajność i dokładność funkcji matematycznych zadeklarowanych w elementach <math.h> i <cmath>.

W przypadku używania zestawu /Zc:cmathnarzędzi języka C++ automatycznie łączy się z funkcją libvcmath-mt.lib matematyczną lub libvcmath-md.lib podczas wywoływania funkcji matematycznych ze standardowego nagłówka biblioteki. Te biblioteki są statycznie połączone z wynikowym plikiem binarnym.

Note

Dyrektywy dołączania systemu używają nawiasów kątowych, więc #include <math.h> jest rozpoznawany, ale #include "math.h" nie.

Ta opcja zastępuje dyrektywy dołączane przez <stdlib.h> system i <math.h> dyrektywy zawierające standardowe nagłówki zastępcze biblioteki. Ta opcja ma wpływ na <cmath> elementy i <cstdlib> dlatego, że są one uwzględniane <math.h> i <stdlib.h>. Nagłówki zastępcze różnią się od odpowiednich nagłówków UCRT w następujący sposób:

  • Definicje funkcji matematycznych to noexcept, co powoduje konflikt z deklaracjami, które nie noexceptsą . Zobacz C2382. Potencjalne poprawki to usunięcie niepotrzebnych deklaracji przekazywania lub dodanie noexcept ich do deklaracji przekazywania.

  • Nie podano definicji funkcji i makr, które nie są częścią standardu C++. To wykluczenie obejmuje stałe matematyczne, takie jak M_PI. Nagłówek <numbers> biblioteki standardowej zawiera zgodne definicje odpowiednich zmiennych. Aby nadal używać tych stałych matematycznych, bezpośrednio dołącz element <corecrt_math_defines.h>. _USE_MATH_DEFINES nie ma żadnego efektu w przypadku używania polecenia /Zc:cmath.

Kontekst

Domyślnie środowisko universal C Runtime (UCRT) implementuje funkcje matematyczne zadeklarowane w systemach <math.h> i <cmath>. Windows obsługuje i wdraża narzędzie UCRT, więc wyniki funkcji matematycznych mogą się różnić w zależności od Windows wersji.

Po włączeniu /Zc:cmathbiblioteki libc llVM implementuje te funkcje matematyczne w statycznie połączonych bibliotekach o nazwach libvcmath-mt.lib i libvcmath-md.lib. Narzędzia kompilacji języka C++ wdrażają te biblioteki, a nie Windows systemu operacyjnego. Ponieważ te funkcje zwracają poprawnie zaokrąglone wyniki, ich wyniki są stabilne w różnych wersjach systemu operacyjnego i architekturach sprzętu.

Aby ustawić tę opcję kompilatora w Visual Studio

  1. Otwórz okno dialogowe Strony właściwości projektu. Aby uzyskać szczegółowe informacje, zobacz Set C++ compiler and build properties in Visual Studio (Ustawianie właściwości kompilatora języka C++ i kompilowania w programie Visual Studio).
  2. Wybierz stronę Właściwości>konfiguracji C/C++>Wiersza polecenia.
  3. Dodaj /Zc:cmath do okienka Dodatkowe opcje: .

Zobacz także

/Zc (Zgodność)
/std (Określ wersję standardową języka)
Stałe matematyczne