/Zc:cmath (Libc-Mathematik aktivieren)

Die /Zc:cmath Compileroption ersetzt die Laufzeitimplementierung von mathematischen Funktionen im <math.h> C-Laufzeitheader und <cmath> C++-Standardbibliotheksheader durch die Libc von LLVM. Diese Implementierung bietet ordnungsgemäß gerundete Ergebnisse in allen Rundungsmodi.

Sie benötigen diese Option für die Kompilierungszeitauswertung der mathematischen C++-Standardbibliotheksfunktionen, die sich in C++23 oder höher befinden constexpr .

Diese Option ist experimentell.

Syntax

/Zc:cmath

Remarks

Sie benötigen die /Zc:cmath Option zusammen mit /std:c++23der Kompilierungszeitauswertung der mathematischen Funktionen, die in C++23 werden constexpr , durch Vorschlag P0533R9: constexpr for <cmath> and <cstdlib>LWG Issue 3834: Missing constexpr for std::intmax_t math functions in <cinttypes>.

Die /Zc:cmath Option ist ab MSVC Build Tools Version 14.52 verfügbar. Sie ist standardmäßig deaktiviert.

Das Aktivieren dieser Option kann sich auf die Leistung und Genauigkeit von mathematischen Funktionen auswirken, die in <math.h> und <cmath>.

Bei Verwendung /Zc:cmathverknüpft das C++-Toolset automatisch mit libvcmath-mt.lib mathematischen Funktionen aus einem Standardbibliotheksheader.libvcmath-md.lib Diese Bibliotheken sind statisch mit der resultierenden Binärdatei verknüpft.

Note

Das System enthält Direktiven, die eckige Klammern verwenden, wird also #include <math.h> erkannt, #include "math.h" aber nicht.

Diese Option ersetzt das System durch Direktiven, die Direktiven enthalten <math.h> und <stdlib.h> die Standardbibliotheksersetzungsheader enthalten. Die Option wirkt sich auf <cmath> und weil sie enthalten und enthalten <math.h> sind.<cstdlib><stdlib.h> Die Ersetzungsheader unterscheiden sich von den entsprechenden UCRT-Headern auf folgende Weise:

  • Mathematische Funktionsdefinitionen sind noexcept, die konfliktet mit Deklarationen, die nicht noexcept. Siehe C2382. Mögliche Korrekturen sind das Entfernen unnötiger Weiterleitungsdeklarationen oder hinzufügen noexcept , um Deklarationen weiterzuleiten.

  • Funktionen und Makrodefinitionen, die nicht Teil des C++-Standards sind, werden nicht bereitgestellt. Dieser Ausschluss schließt die mathematischen Konstanten ein, z M_PI. B. . Der Standardbibliotheksheader <numbers> stellt konforme Definitionen entsprechender Variablen bereit. Wenn Sie diese mathematischen Konstanten weiterhin verwenden möchten, schließen Sie <corecrt_math_defines.h>direkt ein. _USE_MATH_DEFINES hat keine Auswirkung, wenn Sie es verwenden /Zc:cmath.

Background

Standardmäßig implementiert die Universelle C-Runtime (UCRT) die in <math.h> und <cmath>. Windows verwaltet und stellt die UCRT bereit, sodass mathematische Funktionsergebnisse je nach Windows Version variieren können.

Wenn Sie die Bibliothek von LLVM aktivieren /Zc:cmath, werden diese mathematischen Funktionen in statisch verknüpften Bibliotheken namens libvcmath-mt.lib und libvcmath-md.lib. Die C++-Buildtools stellen diese Bibliotheken bereit, nicht das Windows Betriebssystem. Da diese Funktionen ordnungsgemäß gerundete Ergebnisse zurückgeben, sind ihre Ergebnisse über Betriebssystemversionen und Hardwarearchitekturen hinweg stabil.

So legen Sie diese Compileroption in Visual Studio

  1. Öffnen Sie das Dialogfeld Eigenschaftenseiten des Projekts. Weitere Informationen erhalten Sie unter Set C++ compiler and build properties in Visual Studio (Festlegen der Compiler- und Buildeigenschaften (C++) in Visual Studio).
  2. Klicken Sie auf der Eigenschaftenseite auf Konfigurationseigenschaften>C/C++>Befehlszeile.
  3. Zum Bereich "Zusätzliche Optionen" hinzufügen/Zc:cmath.

Siehe auch

/Zc (Konformität)
/std (Standardversion für die Sprache festlegen)
Mathematische Konstanten