/Zc:cmath (Включить математику libc)

Параметр /Zc:cmath компилятора заменяет реализацию математических функций среды выполнения в <math.h> заголовке среды выполнения C и <cmath> заголовке стандартной библиотеки C++ на libc LLVM. Эта реализация обеспечивает правильные округленные результаты во всех режимах округления.

Этот параметр необходим для оценки математических функций стандартной библиотеки C++, которые становятся constexpr в C++23 или более поздней версии.

Этот параметр является экспериментальным.

Syntax

/Zc:cmath

Remarks

Вам нужен /Zc:cmath вариант, а также /std:c++23для оценки математических функций во время компиляции, которые становятся constexpr в C++23 по предложению P0533R9: constexpr для <cmath> и <cstdlib>LWG Issue 3834: Отсутствует constexpr для std::intmax_t математических функций.<cinttypes>

Этот /Zc:cmath параметр доступен начиная с MSVC Build Tools версии 14.52. Он отключен по умолчанию.

Включение этого параметра может повлиять на производительность и точность математических функций, объявленных в <math.h> и <cmath>.

При использовании /Zc:cmathнабор инструментов C++ автоматически связывается с libvcmath-mt.lib математическими libvcmath-md.lib функциями из заголовка стандартной библиотеки. Эти библиотеки статически связаны с результирующий двоичный файл.

Note

Директивы включения системы используют угловые скобки, поэтому #include <math.h> распознается, но #include "math.h" не является.

Этот параметр заменяет системные директивы, которые включают <math.h> и <stdlib.h> директивы, включающие заголовки замены стандартной библиотеки. Этот параметр влияет и <cstdlib> потому, что они включают <cmath><math.h> и<stdlib.h>. Заменяющие заголовки отличаются от соответствующих заголовков UCRT следующими способами:

  • Определения математических функций являются noexceptопределениями, которые конфликтуют с объявлениями, которые не noexceptявляются. См. раздел C2382. Возможные исправления — удалить ненужные объявления пересылки или добавить noexcept в объявления пересылки.

  • Функции и определения макросов, которые не являются частью стандарта C++, не предоставляются. Это исключение включает математические константы, такие как M_PI. Заголовок <numbers> стандартной библиотеки предоставляет соответствующие определения соответствующих переменных. Чтобы продолжить использование этих математических констант, напрямую включите <corecrt_math_defines.h>. _USE_MATH_DEFINES не действует при использовании /Zc:cmath.

Предыстория

По умолчанию универсальная среда выполнения C (UCRT) реализует математические функции, объявленные в <math.h> и <cmath>. Windows поддерживает и развертывает UCRT, поэтому результаты математических функций могут отличаться по Windows версии.

При включении /Zc:cmathlibc LLVM реализует эти математические функции в статически связанных библиотеках с именем libvcmath-mt.lib и libvcmath-md.lib. Средства сборки C++ развертывают эти библиотеки, а не операционную систему Windows. Так как эти функции возвращают правильные округленные результаты, их результаты стабильны в версиях операционной системы и аппаратных архитектурах.

Установка этого параметра компилятора в Visual Studio

  1. Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.
  2. Перейдите на страницу свойств Свойства конфигурации>C/C++>Командная строка.
  3. Добавьте /Zc:cmath в область "Дополнительные параметры".

См. также

/Zc (Соответствие)
/std (определение стандартной версии языка)
Математические константы