为什么abs()和fabs()在C中的两个不同的头文件中定义

时间:2016-08-23 09:56:48

标签: c header-files c-standard-library

标准库函数abs()stdlib.h中声明,而fabs()math.h中。

为什么它们位于不同的标题中?

2 个答案:

答案 0 :(得分:5)

math.h首次出现在第七届Unix研究中。很难说它是如何到达那里的。例如,[1]声称C库的某些部分是从" PWB / Unix"其中包括troff和C编译器pcc,但我无法证明这一点。

另一个有趣的信息是来自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,只有少数C程序与-lm标志链接。所以我的结论是推测性的:

  1. libm.a(和math.h)主要用于FORTRAN程序,因此它被分成库以减少二进制占用空间(请注意它是静态链接的)。
  2. 没有多少机器具有浮点支持。例如,您需要购买 PDP-11的可选FPP [2],在Unix中还有libfpsim仿真库来缓解这种情况,因此在早期的C程序中很难使用浮点数。
  3. 1. A History of UNIX before Berkeley: UNIX Evolution: 1975-1984

    2. PDP-11 architecture

答案 1 :(得分:-1)

大多数像+ - / *这样的运算符也是数学运算符,但这些运算符也很容易获得。在编程时你使用了如此多的数学,开发人员已经开始区分日常用品所需的数学和更专业的数学,而你只是在某些时候使用。 Abs是经常使用的功能之一。与指针算法一样,只是想知道差异来计算内存块的大小。但是你不知道哪个内存更高,哪个更低。

总而言之:经常使用abs,因为它计算两个整数的差异。例如,两个指针之间的差异也是整数。所以它在stdlib.h中。除非你在做数学特定的东西,否则你不会需要太多东西。因此它在math.h中。