ジェネリック型数値演算
ISO C 標準 11 (C11) 以降では、<tgmath.h>
ヘッダーと、<math.h>
、<complex.h>
には、パラメーターの型に基づいて対応する数値演算関数を呼び出すマクロが用意されています。
C ランタイム ライブラリの数値演算関数には、実数と複合値のバリアントがあります。 各バリアントは引数の型に応じて float
、double
、long double
の 3 種類に分かれます。 C は C++ のようにオーバーロードをサポートしていないため、各バリアントには異なる名前が付けられています。 たとえば、実数の浮動小数点値の絶対値を取得するには、float
、double
、long double
のどの値を渡すかに応じて、それぞれ fabsf
、fabs
、fabsl
のいずれかを呼び出します。 複合値の絶対値を取得するには、float
、double
、long double
のどの複合値を渡しているかに応じて、それぞれ cabsf
、cabs
、cabsl
のいずれかを呼び出します。 引数が上記のメンション型のいずれにも一致しない場合は、引数が double であるかのように関数が選択されます。
<tgmath.h>
には、呼び出す適切な数値演算関数の選択を簡略化するマクロが含まれています。 これらのマクロを使うと、渡した型を調べてから、適切な関数を呼び出すことができます。 たとえば、sqrt
マクロを使うと、sqrt(9.9f)
は sqrtf()
にバインドされますが、sqrt(9.9)
は sqrt()
にバインドされます。 ジェネリック パラメーターの少なくとも 1 つのマクロ引数が複合値である場合、マクロによって複合型の関数にバインドされます。それ以外の場合は実数型の関数が呼び出されます。
<tgmath.h>
でジェネリック型マクロを使うと、より移植性の高いコードを記述できます。これは、キャストを管理したり、引数の型に応じて異なる関数名を選ぶ必要がないからです。
これらのマクロは、<math.h>
ヘッダーを使って書かれたプログラムが破損しないように、独自のヘッダー内にあります。 そのため、<math.h> をインクルードすると、double x = sin(42);
は常に同じように動作します。 それでも、既存のほとんどの C プログラムは、<math.h>
または <complex.h>
ではなく <tgmath.h>
ヘッダーがインクルードされいる場合に、影響を受けないことが期待されます。
<tgmath.h>
で使用できるマクロと、それらが拡張する内容を次の表に示します。 modf
がこの表に含まれていないのは、型の解決を複雑にすることなく安全にする方法が明確でなく、対応するジェネリック型のマクロがないためです。
必要条件
/std:c11
を使ってコンパイルします。
Windows SDK バージョン 10.0.20348.0 (バージョン 2104) 以降。 最新の SDK のダウンロードするには、「Windows SDK」を参照してください。 C11 および C17 開発用 SDK をインストールして使用する手順については、「C11 と C17 のサポートを Visual Studio にインストールする」を参照してください。