Зачем определению(definition) объявлять(to declares), если есть определение(definition), которое определяет(to defines)?

В языке программирования C существует разделение между объявлениями (declarations) и определениями (definitions). Объявление предоставляет информацию о существовании переменных, функций или типов данных, а определение конкретизирует эту информацию.

Зачем же определению объявлять, если уже есть определение? Для понимания этого нам нужно узнать, как работает компилятор C.

Компилятор C работает в несколько этапов. На первом этапе, называемом "фазой анализа", компилятор сканирует весь код программы, собирая информацию обо всех объявлениях. Этот этап важен, так как код может ссылаться на объекты, которые будут определены позже, и компилятор должен знать о них заранее.

Второй этап, называемый "фазой определения", состоит в определении всех объявленных объектов. На этом этапе компилятор использует объявления, чтобы создать конкретные объекты в памяти, выделить им место и установить необходимые связи.

Теперь вернемся к вопросу: зачем определению объявлять? Ответ в том, что объявление и определение могут быть разнесены в разные файлы или модули программы. Объявление позволяет компилятору знать о существовании объекта и его типа, чтобы код, который ссылается на этот объект, мог быть скомпилирован.

Определение, с другой стороны, предоставляет компилятору информацию о том, как выделить память для объекта и как инициализировать его. Это позволяет компилятору создать конкретный объект и установить ссылки на него.

Итак, объявление и определение имеют разные цели и выполняют разные функции в процессе компиляции программы на C. Объявление информирует компилятор о существовании объекта, а определение конкретизирует эту информацию и создает объект в памяти. Разделение между объявлением и определением позволяет организовывать код программы более гибко и рационально.