В современном C вы всегда должны объявлять функцию перед ее использованием. (Это включает в себя определение функции перед ее использованием, поскольку определение является объявлением.) Неявное объявление функций для возврата int
- это поведение очень старых версий C. Его не следует использовать, компиляторы должны по крайней мере предупреждать об этом, и вы должны настроить свой компилятор так, чтобы он выдавал ошибку, а не предупреждение.
Функции обычно объявляются вне других функций. Нет ничего явно неправильного в объявлении функции внутри другой функции, но мы редко делаем это, потому что обычно мы хотим, чтобы функции были видны во всем модуле перевода, а не только в одном конкретном месте. (Единицей перевода является один исходный файл вместе со всеми файлами, включенными в него с помощью директив #include
.) Имена функций подчиняются тем же правилам scope , что и имена объектов: если они появляются вне какой-либо функции, ониимеет область действия файла . Если он появляется внутри блока (список операторов внутри фигурных скобок, { … }
, который включает в себя тела функций), он имеет область действия блока и виден только в этом блоке.
То, будет ли функция объявлена в области видимости файла или блока, не повлияет на ее поведение.
main
не является особенным в этом отношении. Скорее всего, вы спрашиваете о main
, потому что вы на раннем этапе обучения программированию и в основном вызываете функции только с main
. Однако функции могут вызываться из других функций, и правила о видимости области и имени не относятся к main
. Если функция объявлена в области видимости файла, ее имя отображается в остальной части модуля перевода. Если функция объявлена в области видимости блока, внутри main
или другой функции, ее имя отображается в остальной части этого блока.
Если определена функция, возвращающая double
, но вы используете ее безесли вы объявите об этом, и ваш компилятор разрешит это, то вы можете ожидать, что ваша программа будет работать некорректно. Компилятор не будет автоматически конвертировать double
в int
. Тип функции важен, чтобы сообщить компилятору, что функция возвращает, потому что компилятор ожидает, что определенные биты будут в определенных местах, когда функция вернется, и он пишет инструкции, полагаясь на это.