Потому что компилятор (точнее его кусок - синтаксический анализатор вроде) смотрит код последовательно. И если он найдет использование фукнции раньше ее объявления - то не сможет понять правильно вы ее используете или нет. Можно конечно сделать несколько проходов - сначала собрать все функции, а потом проверять корректность - но это увеличит время проверки. Поэтому нужно сначала объявить прототип - дать понять компилятору что такая функция будет и с какими параметрами, а потом уже использовать.
Конкретно расположение относительно main тут ни при чем.