Организация заголовков и исходников, компиляция
Как программа на C++ распределяется по файлам и как компилятор превращает её в исполняемый файл
- отличать объявление от определения и формулировать правило одного определения,
- разбивать компонент на заголовок
.hи исходник.cpp, - прослеживать сборку через препроцессинг, компиляцию и компоновку,
- защищать заголовок стражем включения или
#pragma once, - решать, что помещать в заголовок, а что в исходный файл.
1. Зачем разбивать код по файлам?
Представьте большую кулинарную книгу. Оглавление перечисляет каждое блюдо по названию и странице: оно говорит, что существует, не печатая рецепт заново. Страницы с рецептами содержат сами шаги. Два повара на разных кухнях могут читать одно оглавление, согласиться, какие блюда существуют, и каждый готовит свою часть.
C++ работает так же. Заголовок (.h или .hpp) — это оглавление: он объявляет имена, типы и форму функций и классов. Исходный файл (.cpp) — это страница рецепта: он содержит рабочий код. Каждый .cpp, желающий использовать функцию, просто подключает заголовок через #include, доверяет, что определение существует где-то, и занимается своей работой.
Это разбиение даёт три вещи: быстрее сборка (измените один .cpp, и перекомпилируется только он), повторное использование (много файлов делят один заголовок) и чёткие интерфейсы (заголовок — публичный контракт, исходник — приватная реализация).