Почему прототип требуется даже без какого-либо объявления класса?

Если я просто сделаю это:Ex1:

#include <iostream>

int main()
{
    //try to call doSomething function
    doSomething();
}

void doSomething()
{
    std::cout << "Call me now!" << std::endl;
}

Я получаю ошибку компиляции! Потому что компиляция не знает, что такое doSomething.

Но если я изменю позицию doSomething, чтобы занять первое место, программа успешно скомпилируется.Ex2:

#include <iostream>

void doSomething()
{
    std::cout << "Call me now!" << std::endl;
}

int main()
{
    //try to call doSomething function
    doSomething();
}

Я могу объявить прототип так:Пример 3:

#include <iostream>

void doSomething(void);

int main()
{
    //try to call doSomething function
    doSomething();
}

void doSomething()
{
    std::cout << "Call me now!" << std::endl;
}

Но почему первый пример не работает? Почему мне даже нужно сначала объявить прототип или вызвать функции и, наконец, функцию main?

Спасибо!

Ответы на вопрос(3)

Ваш ответ на вопрос