泛型类型数学
对于 ISO C 标准 11 (C11) 及更高版本,标头 <tgmath.h>
除了包括 <math.h>
和 <complex.h>
之外,还提供了根据参数类型调用相应数学函数的宏。
C 运行时库数学函数有实变函数和复变函数两种变体。 每个变体有三种风格,具体取决于参数的类型:float
、double
和 long double
。 由于 C 不支持像 C++ 一样重载,因此每个变体都有不同的名称。 例如,若要获取实际浮点值的绝对值,需要分别调用 fabsf
、fabs
或 fabsl
,具体取决于传递的是 float
、double
、还是 long double
值。 若要获取复杂绝对值,需要调用 cabsf
、cabs
或 cabsl
值之一,具体取决于传递的是 float
、double
还是 long double
复杂值。 如果参数与上述任何类型都不匹配,则选择该函数时,将参数视为双精度数。
<tgmath.h>
包含的宏可用于在调用正确数学函数时简化选择。 宏检查所传递的类型,然后调用正确的函数。 例如,宏 sqrt
将 sqrt(9.9f)
绑定到 sqrtf()
,而将 sqrt(9.9)
绑定到 sqrt()
。 如果泛型参数至少有一个复杂的宏参数,则宏会绑定到复杂函数;否则,会调用一个实际函数。
在 <tgmath.h>
中使用泛型宏可以编写更易于移植的代码,因为无需根据参数类型来管理强制转换或选择不同的函数名称。
这些宏位于其自己的标头中,以便使用 <math.h>
标头编写的程序不会中断。 因此,包含 <math.h> 时,double x = sin(42);
表现如常。 即便如此,在包含标头 <tgmath.h>
而非 <math.h>
或 <complex.h>
时,都不想大多数现有的 C 程序受到影响。
下表列出了 <tgmath.h>
中可用的宏及其扩展内容。 modf
不包含在此表中,因为它没有相应的泛型宏,不清楚如何在不复杂化类型解析的情况下保证安全。
要求
使用 /std:c11
进行编译。
Windows SDK 10.0.20348.0(版本 2104)或更高版本。 请参阅 Windows SDK 以下载最新的 SDK。 有关安装和使用 SDK 进行 C11 和 C17 开发的说明,请参阅在 Visual Studio 中安装 C11 和 C17 支持。