標準ライブラリ関数abs()
は で宣言されていますがstdlib.h
、fabs()
はで宣言されていmath.h
ます。
なぜそれらは異なるヘッダーに存在するのですか?
標準ライブラリ関数abs()
は で宣言されていますがstdlib.h
、fabs()
はで宣言されていmath.h
ます。
なぜそれらは異なるヘッダーに存在するのですか?
math.hは、7th Research Unix で初めて登場しました。どうやってそこにたどり着いたかを言うのは難しいです。たとえば、[1] は、C ライブラリの一部がtroff
、C コンパイラを含む「PWB/Unix」からマージされたと主張していますがpcc
、それを証明することはできません。
もう 1 つの興味深い情報は、V7 Unix: intro.3のライブラリ マニュアルです。
(3) These functions, together with those of section 2 and those marked (3S), constitute library libc, which is automatically loaded by the C compiler cc(1) and the Fortran compiler f77(1). The link editor ld(1) searches this library under the `-lc' option. Declarations for some of these functions may be obtained from include files indicated on the appropri- ate pages.
<...>
(3M) These functions constitute the math library, libm. They are automati- cally loaded as needed by the Fortran compiler f77(1). The link editor searches this library under the `-lm' option. Declarations for these functions may be obtained from the include file <math.h>.
V7 コマンドの makefile を調べると、-lm
flag でリンクされている C プログラムはほとんどありません。したがって、私の結論は推測です。
libm.a
(およびmath.h
) は主に FORTRAN プログラムで主に必要とされたため、バイナリ フットプリントを削減するためにライブラリに分割されました (静的にリンクされていることに注意してください)。+ - / * などのほとんどの演算子は数学演算子でもありますが、これらもすぐに使用できます。プログラミングでは数学を多用するため、開発者は、日常的な作業に必要な数学と、一部の時間しか使用しないより専門的な数学を区別し始めています。Abs は、よく使用される関数の 1 つです。メモリブロックのサイズを計算するために違いを知りたいときのポインター演算と同様です。しかし、どちらがメモリが高く、どちらが低いかを知りたいわけではありません。
要約すると、 abs は2つの整数の差を計算するため、よく使用されます。たとえば、2 つのポインターの差も整数です。そしてそれはstdlib.hにあります。fabs は、数学特有のことをしていない限り、それほど必要なものではありません。したがって、それは math.h にあります。