编译器/Zc:cmath选项将 C 运行时标头和 <cmath> C++ 标准库标头中的<math.h>数学函数的运行时实现替换为 LLVM 的 libc。 此实现在所有舍入模式下提供正确舍入的结果。
对于 C constexpr ++23 或更高版本中的 C++ 标准库数学函数的编译时评估,需要此选项。
此选项是实验性的。
Syntax
/Zc:cmath
Remarks
你需要该选项,以及/std:c++23用于按建议P0533R9:for 和 LWG 问题 3834:数学函数缺少 constexpr 的数学函数的std::intmax_t编译时评估。建议P0533R9:for 和 LWG 问题 3834:缺少数学函数的 <cinttypes>constexpr。<cstdlib><cmath>constexprconstexpr/Zc:cmath
从 MSVC 生成工具版本 14.52 开始,此选项 /Zc:cmath 可用。 默认情况下,它处于关闭状态。
启用此选项可能会影响在和中 <math.h> 声明的数学函数的性能和 <cmath>准确性。
使用 /Zc:cmath时,C++ 工具集会自动链接到 libvcmath-mt.lib 标准库标头中的数学函数或 libvcmath-md.lib 从标准库标头调用数学函数时。 这些库静态链接到生成的二进制文件。
注释
系统 include 指令使用尖括号,因此 #include <math.h> 可以识别,但 #include "math.h" 无法识别。
此选项将替换系统包含的 <math.h> 指令以及 <stdlib.h> 包含标准库替换标头的指令。 该选项会影响以及<cmath><cstdlib>因为它们包括<math.h>和 <stdlib.h>。 替换标头与相应的 UCRT 标头不同,方法如下:
数学函数定义与
noexcept不是noexcept的声明冲突。 请参阅 C2382。 可能的修补程序是删除不必要的转发声明或noexcept添加到转发声明。不提供不属于 C++ 标准的函数和宏定义。 此排除项包括 数学常量,例如
M_PI。<numbers>标准库标头提供相应变量的一致性定义。 若要继续使用这些数学常量,请直接包括<corecrt_math_defines.h>。_USE_MATH_DEFINES使用/Zc:cmath时不起作用。
背景
默认情况下,通用 C 运行时(UCRT)实现在和<cmath>中<math.h>声明的数学函数。 Windows维护和部署 UCRT,因此数学函数结果可能因Windows版本而异。
启用 /Zc:cmath后,LLVM 的 libc 在名为 libvcmath-mt.lib 和 libvcmath-md.lib的静态链接库中实现这些数学函数。 C++ 生成工具部署这些库,而不是Windows操作系统。 由于这些函数返回正确舍入的结果,因此其结果在操作系统版本和硬件体系结构中是稳定的。
在 Visual Studio 中设置此编译器选项
- 打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性。
- 选择“配置属性”“C/C++”>“命令行”属性页>。
- 添加到
/Zc:cmath“其他选项:”窗格。