Определение и объявление переменной являются двумя различными, но связанными операциями.
Определение функции означает, что тело функции записано: int f(void) { return 0; }
Определение переменной означает, что часть памяти зарезервирована для переменной: int x; or extern int x=0;
Если переменная не определена, программа считает, что переменная инициализируется и потенциально имеет любое значение в своем полном диапазоне.
Если функция не определена, программное обеспечение блокирует функцию.
Объявление функции: int f(void);
Объявление переменной: extern int x;
Объявление предоставляет информацию о типе функции или переменной. При использовании функции или переменной в файле, где она не была объявлена, возникает ошибка компиляции.