Оригинал K & R определено fgets()
на стр.155 с аргументом int
. Код, представленный в книге, работал бы с unsigned int
(он использует >0
, но цикл написан так, чтобы он никогда не опускался ниже нуля).
size_t
введено позже, в C89 (ANSI C), как тип sizeof()
. Поскольку эта функция была специально введена для согласования распределения памяти, соответственно обновлялись функции управления и строковые функции. Но файловый ввод-вывод не был: единственными файловыми функциями, которые использовали size_t
в C89, являются те новые , введенные C89 и не существовавшие в K & R, такие как, например, fread()
/fwrite()
. Да, K & R не имел этих функций и полагался только на операции с блоком только на (не переносные) функции чтения/записи unix с использованием дескрипторов файлов.
Следует отметить, что POSIX standard, который гармонизировал функции unix, был разработан параллельно с стандартом ANSI C и issued late 1988. Этот стандарт гармонизировал многие функции unix для использования size_t
, так что read()
/write()
в настоящее время определены с помощью size_t
. Но для стандартных функций библиотеки C, таких как fgets()
, POSIX дает преимущество в C стандартной (формулировки текущей версии стандарта):
функциональных возможностей, описанных на этой справочной странице совмещен со стандартом ISO C , Любой конфликт между описанными здесь требованиями и стандартом ISO C является непреднамеренным.
Таким образом, в стандарте POSIX также, как ни странно, до сих пор fgets()
унаследовал от своего исторического K & R int
.
Edit: дополнительное чтение
STDIO.h: Этот заголовок определяет и прототипы большинства функций, перечисленных в главе 7 K & R. Немногие, если таковые имеются, были внесены изменения в определениях , найденные в K & R, но было добавлено несколько новых функций.
В стандартной библиотеке C отсутствует согласованность. С течением времени функции эволюционировали. 'size_t', возможно, не существовало, когда был введен« fgets »(просто моя догадка). – user694733
https://groups.google.com/forum/#!topic/comp.std.c/FnENEIlCidg – artm
Истерические изюм. Вероятно, ранняя реализация (до стандартизации) использования «int» и ее продолжение для «совместимости» при стандартизации C. И я голосую, чтобы закрыть как * основанное на мнениях *. –