/Zc:cmath (Abilitare la matematica libc)

L'opzione /Zc:cmath del compilatore sostituisce l'implementazione di runtime delle funzioni matematiche nell'intestazione <math.h> del runtime C e <cmath> nell'intestazione della libreria standard C++ con libc di LLVM. Questa implementazione fornisce risultati arrotondati correttamente in tutte le modalità di arrotondamento.

Questa opzione è necessaria per la valutazione in fase di compilazione delle funzioni matematiche della libreria standard C++ che diventano constexpr in C++23 o versioni successive.

Questa opzione è sperimentale.

Syntax

/Zc:cmath

Remarks

È necessaria l'opzione /Zc:cmath , insieme /std:c++23a , per la valutazione in fase di compilazione delle funzioni matematiche che diventano constexpr in C++23 dalla proposta P0533R9: constexpr for <cmath> e <cstdlib>LWG Issue 3834: Missing constexpr for std::intmax_t math functions in <cinttypes>.

L'opzione /Zc:cmath è disponibile a partire da MSVC Build Tools versione 14.52. È disattivato per impostazione predefinita.

L'abilitazione di questa opzione potrebbe influire sulle prestazioni e sull'accuratezza delle funzioni matematiche dichiarate in <math.h> e <cmath>.

Quando si usa /Zc:cmath, il set di strumenti C++ si collega automaticamente a libvcmath-mt.lib o libvcmath-md.lib quando si chiamano funzioni matematiche da un'intestazione di libreria standard. Queste librerie sono collegate in modo statico nel file binario risultante.

Note

Le direttive di inclusione di sistema usano parentesi angolari, quindi #include <math.h> viene riconosciuto ma #include "math.h" non lo è.

Questa opzione sostituisce le direttive di inclusione del sistema che includono e <stdlib.h> con direttive che includono <math.h> intestazioni di sostituzione della libreria standard. L'opzione influisce e <cmath><cstdlib> perché includono <math.h> e <stdlib.h>. Le intestazioni di sostituzione differiscono dalle intestazioni UCRT corrispondenti nei modi seguenti:

  • Le definizioni delle funzioni matematiche sono noexcept, che sono in conflitto con le dichiarazioni che non noexceptsono . Vedere C2382. Le potenziali correzioni sono di rimuovere dichiarazioni di inoltro non necessarie o di aggiungere noexcept dichiarazioni di inoltro.

  • Le funzioni e le definizioni di macro che non fanno parte dello standard C++ non vengono fornite. Questa esclusione include le costanti matematiche, ad esempio M_PI. L'intestazione <numbers> della libreria standard fornisce definizioni conformi delle variabili corrispondenti. Per continuare a usare queste costanti matematiche, includere <corecrt_math_defines.h>direttamente . _USE_MATH_DEFINES non ha alcun effetto quando si usa /Zc:cmath.

Background

Per impostazione predefinita, Universal C Runtime (UCRT) implementa le funzioni matematiche dichiarate in <math.h> e <cmath>. Windows gestisce e distribuisce ucrt, quindi i risultati delle funzioni matematiche possono variare in base Windows versione.

Quando si abilita /Zc:cmath, il libc di LLVM implementa queste funzioni matematiche nelle librerie collegate staticamente denominate libvcmath-mt.lib e libvcmath-md.lib. Gli strumenti di compilazione C++ distribuiscono queste librerie, non il sistema operativo Windows. Poiché queste funzioni restituiscono risultati arrotondati correttamente, i risultati sono stabili tra le versioni del sistema operativo e le architetture hardware.

Per impostare questa opzione del compilatore in Visual Studio

  1. Aprire la finestra di dialogo Pagine delle proprietà del progetto. Per informazioni dettagliate, vedere Impostare il compilatore e le proprietà di compilazione.
  2. Selezionare la pagina delle proprietà Proprietà di configurazione>C/C++>Riga di comando.
  3. Aggiungere /Zc:cmath al riquadro Opzioni aggiuntive: .

Vedere anche

/Zc (Conformità)
/std (Specificare la versione standard della lingua)
Costanti matematiche