Начало компиляции и начало выполнения программы - это две разные вещи.
Выполнение начинается с main
.
Компиляция начинается с начала файла; компилятор не «перепрыгивает» файл, чтобы найти нужные фрагменты, но он считывает входные данные линейно (я подозреваю, что это связано, помимо прочего, с тем, что грамматика C ++ действительно сложна).
Когда компилятор в какой-то момент разбирает файл, он знает только то, что было объявлено / определено до этого момента 1 .
В связи с этим были изобретены прототипы функций (и вообще не определяющие объявления): прототипы всех функций , определенных в файле, помещаются в начало файл, обычно после директив #include
или в отдельном включаемом файле. Прототипы сообщают компилятору, что такие функции будут определены позже, и какова сигнатура функции (то есть имя, параметры, возвращаемое значение).
Прототип выполнен как обычная функция, но без тела, которое заменяется точкой с запятой 2 . Например, в вашем коде вы должны написать
void f();
до main
.
<ч />
IIRC есть некоторые ограничения в этом правиле, которые позволяют компилятору "ждать" некоторых объявлений, чтобы заставить работать магию шаблона, но здесь это не имеет значения.
В прототипе также часто не пишут имена параметров, оставляя только их тип (это можно сделать и в определениях функций, но это не имеет особого смысла, если у вас нет формального параметра Вы не используете). Тем не менее, я предпочитаю оставлять там имена параметров в виде документации.