/Zc:cmath (Aktivera libc math)

Kompileringsalternativet /Zc:cmath ersätter körningsimplementeringen av matematiska funktioner i <math.h> C-körningshuvudet och <cmath> C++- standardbibliotekshuvudet med LLVM:s libc. Den här implementeringen ger korrekt avrundade resultat i alla avrundningslägen.

Du behöver det här alternativet för kompileringstidsutvärdering av matematikfunktionerna för C++-standardbiblioteket som finns constexpr i C++23 eller senare.

Det här alternativet är experimentellt.

Syntax

/Zc:cmath

Remarks

Du behöver /Zc:cmath alternativet, tillsammans med /std:c++23, för kompileringstidsutvärdering av matematiska funktioner som blir constexpr i C++23 efter förslag P0533R9: constexpr för <cmath> och <cstdlib>LWG Issue 3834: Missing constexpr for std::intmax_t math functions in <cinttypes>.

Alternativet /Zc:cmath är tillgängligt från och med MSVC Build Tools version 14.52. Det är inaktiverat som standard.

Om du aktiverar det här alternativet kan det påverka prestanda och noggrannhet för matematiska funktioner som deklareras i <math.h> och <cmath>.

När du använder /Zc:cmathlänkar C++-verktygsuppsättningen automatiskt mot libvcmath-mt.lib eller libvcmath-md.lib när du anropar matematiska funktioner från en standardbiblioteksrubrik. Dessa bibliotek är statiskt länkade till den resulterande binärfilen.

Note

System inkluderar direktiv använder vinkelparenteser, så #include <math.h> identifieras men #include "math.h" är inte det.

Det här alternativet ersätter systemet med direktiv som innehåller <math.h> och <stdlib.h> med direktiv som innehåller standardbibliotekets ersättningshuvuden. Alternativet påverkar <cmath> och <cstdlib> eftersom de inkluderar <math.h> och <stdlib.h>. Ersättningshuvudena skiljer sig från motsvarande UCRT-huvuden på följande sätt:

  • Matematiska funktionsdefinitioner är noexcept, som står i konflikt med deklarationer som inte noexceptär . Se C2382. Potentiella korrigeringar är att ta bort onödiga framåtdeklarationer eller lägga noexcept till i framåtriktade deklarationer.

  • Funktioner och makrodefinitioner som inte ingår i C++-standarden tillhandahålls inte. Det här undantaget inkluderar matematiska konstanter, till exempel M_PI. Standardbiblioteksrubriken <numbers> innehåller överensstämmande definitioner av motsvarande variabler. Om du vill fortsätta använda dessa matematiska konstanter inkluderar du <corecrt_math_defines.h>direkt . _USE_MATH_DEFINES har ingen effekt när du använder /Zc:cmath.

Bakgrund

Som standard implementerar UCRT (Universal C Runtime) de matematiska funktioner som deklarerats i <math.h> och <cmath>. Windows underhåller och distribuerar UCRT, så matematiska funktionsresultat kan variera beroende på Windows version.

När du aktiverar /Zc:cmathimplementerar LLVM:s libc dessa matematiska funktioner i statiskt länkade bibliotek med namnet libvcmath-mt.lib och libvcmath-md.lib. C++-byggverktygen distribuerar dessa bibliotek, inte Windows operativsystem. Eftersom dessa funktioner returnerar korrekt avrundade resultat är deras resultat stabila mellan operativsystemversioner och maskinvaruarkitekturer.

Ange det här kompilatoralternativet i Visual Studio

  1. Öppna dialogrutan egenskapssidor för projektet. Mer information finns i Ange C++-kompilator- och byggegenskaper i Visual Studio.
  2. Välj egenskapssidan Konfigurationsegenskaper>C/C++>Kommandorad .
  3. Lägg till /Zc:cmath i fönstret Ytterligare alternativ: .

Se även

/Zc (Överensstämmelse)
/std (Ange språkstandardversion)
Matematiska konstanter