Ответ 1
Исходный 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, который гармонизировал функции unix, был разработан параллельно с
стандарт ANSI C и выпущенный в конце 1988 года. Этот стандарт гармонизировал многие функции unix, чтобы использовать size_t
, чтобы read()
/write()
в настоящее время
определяются с помощью size_t
. Но для стандартных функций библиотеки C, таких как fgets()
, POSIX дает преимущество стандарту C
(формулировка текущей версии стандарта):
Функциональность, описанная на этой справочной странице, соответствует стандарту ISO C. Любой конфликт между описанными здесь требованиями и стандартом ISO C является непреднамеренным.
Таким образом, в POSIX, по иронии судьбы, fgets()
все еще унаследован от своего исторического K & R int
.
Изменить: дополнительное чтение
- Переход от K & R к Ansi C - Dr.Dobb - 1989:
stdio.h: Этот заголовок определяет и прототипы большинства функций, перечисленных в главе 7 K & R. Немногие, если таковые имеются, были внесены изменения в определения, найденные в K & R, но добавлено несколько новых функций.