Прежде всего, причина math.h
необходима для некоторых операций, а не для других - то, что люди, которые разработали C, решили встроить некоторые вещи в основной язык и хранить некоторые вещи в отдельных наборах, в том числе набор для математики., набор вещей для строк, набор вещей для времени, набор вещей для ввода и вывода и т. д.
Можно было бы встроить вещи в math.h
в основной язык,Например, sizeof
встроен в язык, поэтому встраивание sqrt
в язык также не потребует изменения грамматики.Кроме того, теоретически было бы возможно исключить некоторые операции, такие как *
, из основного языка и потребовать, чтобы вы включили math.h
перед их использованием.Тем не менее, в языке предусмотрены способы объявления функций, таких как sqrt
, но не предусмотрены способы объявления операторов, таких как *
, поэтому необходимо внести некоторые изменения в грамматику для поддержки этого.
Итак, поскольку возможно основной язык может включать или исключать различные вещи, тогда причины включения или исключения различных вещей в некоторой степени являются вопросом выбора.По сути, основные арифметические операции считались фундаментальными и очень полезными, поэтому они стали частью основного языка, а другие функции - нет.Этому способствуют различные факторы.
Желание избегать загромождения языка.Если бы все функции, объявленные в заголовках, были частью основного языка, то sqrt
можно было бы использовать только для sqrt
в math.h
.Программист не может использовать sqrt
для собственного имени переменной.Это хорошо для нескольких имен, но, по мере роста библиотеки, вероятность столкновения между именем в библиотеке и именем в обычном исходном коде возрастает.
Кроме того, если существует исходный коди у кого-то есть блестящая идея для новой подпрограммы, добавление имени новой подпрограммы в язык может нарушить существующий код, который уже использует это имя для других целей.
Так что, как правило, мы предпочитаем реализовыватьосновные подпрограммы в отдельных наборах, и тогда авторы могут выбрать те, которые они хотят использовать и изучить, и могут оставить те, которые им не нужны, и избежать проблем.
Разделение библиотек на наборы, подобные этомутакже означает, что библиотечные подпрограммы, не используемые программой, не обязательно должны быть связаны с конечным исполняемым файлом программы, поэтому размер исполняемого файла может быть меньше.
Кроме того, это означает, что C может использоваться в различных средах,например, небольшая машина, которая не в состоянии поддерживать полную математическую библиотеку.Кто-то может захотеть запускать простые программы, которые просто работают с базовой арифметикой на небольшом процессоре.Если базовый язык C невелик, они могут писать такие программы.Если каждая программа на С должна включать все подпрограммы в библиотеках, возможно, не удастся заставить работать С на очень маленьких компьютерах.