Необходимо понимать разницу между объявлением и определением.
Определение (definition) связывает имя с реализацией:
-Определение переменной побуждает компилятор зарезервировать некоторую область памяти (возможно, задав ей некоторое определённое значение). -Определение функции заставляет компилятор сгенерировать код для этой функции.
Примеры определений:
void Foo(void) { } int x;
Объявление (declaration) говорит компилятору, что определение функции или
переменной (с конкретным именем) существует в другом месте программы (вероятно, в другом C-файле).
Примеры объявлений:
void Foo(void); extern int x;
Заметьте, что определение также является объявлением — фактически это объявление, в
котором «другое место» программы совпадает с текущим.