Стандартная библиотечная функция abs()
объявлена в stdlib.h
, а fabs()
- в math.h
.Почему abs() и fabs() определены в двух разных заголовках в C
Почему они находятся в разных заголовках?
Стандартная библиотечная функция abs()
объявлена в stdlib.h
, а fabs()
- в math.h
.Почему abs() и fabs() определены в двух разных заголовках в C
Почему они находятся в разных заголовках?
Большинство операторов, таких как + -/*, также являются операторами математики, но они также легко доступны. При программировании вы используете так много математики, что разработчики начали различать математику, которая необходима для повседневных вещей и математики, которая более специализирована, и вы используете ее только некоторое время. Abs - одна из тех функций, которые часто используются. Как с арифметикой указателя, когда вы просто хотите узнать разницу, чтобы вычислить размер блока памяти. Но вам не интересно знать, что выше в памяти, а что ниже.
Итак, суммируем: abs используется часто, потому что он вычисляет разность двух целых чисел. Разница между двумя указателями, например, также является целым числом. И так это в stdlib.h. fabs, как бы то ни было, вам не понадобится много, если вы не будете заниматься математикой. Так оно и есть в математике.
Это не отвечает, почему эти функции находятся в отдельных файлах. – HolyBlackCat
@HolyBlackCat: Он делает сейчас :) –
math.h сначала появляется в 7-м Исследовательском 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 команды мейкфайлы, только несколько программ C связаны с флагом -lm
. Так что мой вывод умозрителен:
libm.a
(и math.h
) в первую очередь необходим для FORTRAN программ в основном, поэтому она была отделена в библиотеку, чтобы уменьшить двоичную след (обратите внимание, что он был связан статический).1. A History of UNIX before Berkeley: UNIX Evolution: 1975-1984
'абс()' 'для int' типа,' FABS() '' для double'. –
Я положил его на исторические причины. – Bathsheba
@WeatherVane Я думаю, что OP это знает. Ему любопытно, почему они находятся в разных заголовках. – Mirakurun