Представьте, что строка
int c, getch(void);
эквивалентна
int c;
int getch(void);
То есть это объявление переменной int
с именем c
, за которой следует прототипдля функции с именем getch
, не принимающей аргументов и возвращающей int
.
. Как показывает этот пример, между "объявлениями" и "прототипами функций" в Си нет жесткой границы. Прототип функции - это просто объявление, который объявляет тип функции, который включает в себя типы ее аргументов.
Это немного необычно, но вовсе не неправильно, объявлять прототип функции с локальной областью действия, подобной этой. Обычно прототип функции объявляется «вверху» исходного файла с глобальной областью действия вне какой-либо функции. (Фактически, обычно прототипы функций объявляются в заголовочных файлах.)
Почему она объявляет функцию как int?
Ну, потому что функция getch
возвращает возвращает int
.
Разве не достаточно вставить прототипы функций перед их вызовом?
Да, и это именно то, чтоэто то же самое происходит - эта строка содержит прототип функции, который объявляет функцию getch
перед ее вызовом.
Суть в том, что каждое объявление функции в C является "внешним", независимо от того, появляется оно внутриили вне функции, содержит ли она спецификатор класса хранения extern
или нет.