15

標準ライブラリ関数abs()は で宣言されていますがstdlib.hfabs()はで宣言されていmath.hます。

なぜそれらは異なるヘッダーに存在するのですか?

4

2 に答える 2

5

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 を調べると、-lmflag でリンクされている C プログラムはほとんどありません。したがって、私の結論は推測です。

  1. libm.a(およびmath.h) は主に FORTRAN プログラムで主に必要とされたため、バイナリ フットプリントを削減するためにライブラリに分割されました (静的にリンクされていることに注意してください)。
  2. 浮動小数点をサポートするマシンは多くありませんでした。たとえば、PDP-11 用のオプションの FPP を購入する必要があります [2]。それを緩和するために、Unix には libfpsim シミュレーション ライブラリもあるため、浮動小数点は初期の C プログラムではほとんど使用できません。

1.バークレー以前の UNIX の歴史: UNIX の進化: 1975-1984

2. PDP-11 アーキテクチャ

于 2016-08-23T23:22:41.447 に答える
-1

+ - / * などのほとんどの演算子は数学演算子でもありますが、これらもすぐに使用できます。プログラミングでは数学を多用するため、開発者は、日常的な作業に必要な数学と、一部の時間しか使用しないより専門的な数学を区別し始めています。Abs は、よく使用される関数の 1 つです。メモリブロックのサイズを計算するために違いを知りたいときのポインター演算と同様です。しかし、どちらがメモリが高く、どちらが低いかを知りたいわけではありません。

要約すると、 abs は2つの整数の差を計算するため、よく使用されます。たとえば、2 つのポインターの差も整数です。そしてそれはstdlib.hにあります。fabs は、数学特有のことをしていない限り、それほど必要なものではありません。したがって、それは math.h にあります。

于 2016-08-23T11:16:28.650 に答える