/Zc:cmath (Libc wiskunde inschakelen)

De /Zc:cmath compileroptie vervangt de runtime-implementatie van wiskundige functies in de <math.h> C Runtime-header en <cmath> de standaardbibliotheekheader van C++ door de libc van LLVM. Deze implementatie biedt correct afgeronde resultaten in alle afrondingsmodi.

U hebt deze optie nodig voor het compileren van de standaardbibliotheekfuncties van de C++-standaardbibliotheek die in C++23 of hoger worden constexpr .

Deze optie is experimenteel.

Syntax

/Zc:cmath

Remarks

U hebt de /Zc:cmath optie nodig, samen met /std:c++23, voor de compilatietijdsevaluatie van de wiskundige functies die in C++23 worden constexpr op voorstel P0533R9: constexpr voor <cmath> en <cstdlib>LWG-probleem 3834: Ontbrekende constexpr voor std::intmax_t wiskundige functies in <cinttypes>.

De /Zc:cmath optie is beschikbaar vanaf MSVC Build Tools versie 14.52. Deze is standaard uitgeschakeld.

Als u deze optie inschakelt, kan dit van invloed zijn op de prestaties en nauwkeurigheid van wiskundige functies die zijn gedeclareerd in <math.h> en <cmath>.

Wanneer u deze gebruikt /Zc:cmath, wordt de C++-toolset automatisch gekoppeld aan libvcmath-mt.lib of libvcmath-md.lib wanneer u wiskundige functies aanroept vanuit een standaardbibliotheekheader. Deze bibliotheken worden statisch gekoppeld aan het resulterende binaire bestand.

Note

Systeem bevat instructies die hoekhaken gebruiken, dus #include <math.h> wordt herkend, maar #include "math.h" niet.

Met deze optie worden systeemrichtlijnen vervangen die onder andere richtlijnen bevatten <math.h><stdlib.h> die standaardkopteksten voor bibliotheekvervanging bevatten. De optie is van invloed op <cmath> en <cstdlib> omdat ze zijn opgenomen <math.h> en <stdlib.h>. De vervangende headers verschillen van de bijbehorende UCRT-headers op de volgende manieren:

  • Wiskundige functiedefinities zijn noexcept, die conflicteert met declaraties die niet noexceptzijn. Zie C2382. Mogelijke oplossingen zijn het verwijderen van onnodige forward-declaraties of het toevoegen noexcept van declaraties aan doorstuurdeclaraties.

  • Functies en macrodefinities die geen deel uitmaken van de C++-standaard, worden niet opgegeven. Deze uitsluiting omvat de wiskundige constanten, zoals M_PI. De <numbers> standaardbibliotheekheader biedt conforme definities van bijbehorende variabelen. Als u deze wiskundige constanten wilt blijven gebruiken, neemt u direct op <corecrt_math_defines.h>. _USE_MATH_DEFINES heeft geen effect wanneer u gebruikt /Zc:cmath.

Achtergrond

De Universal C Runtime (UCRT) implementeert standaard de wiskundige functies die zijn gedeclareerd in <math.h> en <cmath>. Windows onderhoudt en implementeert het UCRT, zodat de resultaten van wiskundige functies kunnen variƫren per Windows versie.

Wanneer u dit inschakelt /Zc:cmath, implementeert LLVM's libc deze wiskundige functies in statisch gekoppelde bibliotheken met de naam libvcmath-mt.lib en libvcmath-md.lib. De C++-buildhulpprogramma's implementeren deze bibliotheken, niet het Windows besturingssysteem. Omdat deze functies correct afgeronde resultaten retourneren, zijn hun resultaten stabiel in besturingssysteemversies en hardwarearchitecturen.

Deze compileroptie instellen in Visual Studio

  1. Open het dialoogvenster eigenschappenpagina's van het project. Zie C++ compiler en buildeigenschappen instellen in Visual Studio voor meer informatie.
  2. Selecteer de eigenschappenpagina configuratie-eigenschappen>C/C++>.
  3. Toevoegen /Zc:cmath aan het deelvenster Extra opties:

Zie ook

/Zc (Conformiteit)
/std (Taalstandaardversie opgeven)
Wiskundige constanten