Первая строка - это объявление функции. Блок кода внизу - это определение функции.
Начиная с версии стандарта ISO C 1999 года, незаконно (нарушение ограничения) вызывать функцию без видимого объявления; объявление должно предшествовать вызову.
Для такой простой программы, как эта, вы можете просто написать полное определение power()
перед определением main()
(поскольку определение также обеспечивает объявление), но для более сложных случаев (таких как рекурсивные вызовы) вам часто нужно предоставить отдельную декларацию.
Для более крупных программ обычно собирают все объявления объявлений в заголовочном файле (например, foo.h
) и соответствующие определения в исходном файле (например, foo.c
) , Директива #include "foo.h"
используется, чтобы сделать объявления видимыми в других файлах. Вы увидите подобные вещи позже в книге.
(В 1990 и более ранних версиях C, которые охватывает K & R2, бывают случаи, когда вы можете вызвать функцию без видимого объявления - но все равно очень хорошая идея предоставить явные объявления в любом случае.)
Между прочим, объявление основной программы действительно должно быть int main(void)
, а не просто main()
.
Терминология: «прототип» - это объявление функции, которое определяет типы параметров.
int power(int base, int n); /* a declaration that's also a prototype */
int power(int, int); /* likewise */
int power(); /* a declaration but not a prototype */
(Имена параметров требуются в определении, но необязательны в отдельной декларации.)
В качестве особого случая в прототипе функции без параметров используется (void)
, поскольку пустые скобки уже означают объявление не-прототипа. Итак, int main(void)
- это прототип, а int main()
- нет.
Объявления, не являющиеся прототипами, являются «устаревшими», что означает, что они могут быть теоретически удалены из будущего языкового стандарта. Но они устарели с 1989 года, и даже в новом стандарте ISO C 2011 года комитет не счел нужным их удалить.