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

Юнит трансляции (translation unit) в C++ — это набор исходных файлов и всех включенных в них заголовочных файлов, которые компилируются вместе. Каждый юнит трансляции обрабатывается компилятором как единое целое.

Разбиение кода на интерфейс и реализацию

  • Интерфейс: Объявления функций, классов, типов и констант, которые используются другими частями программы. Этот код обычно помещается в заголовочные файлы (.h, .hpp).

  • Реализация: Реализация функций и методов классов, которая содержит конкретные детали их работы. Этот код обычно помещается в исходные файлы (.cpp).

Организация кода в нескольких файлах

Чтобы организовать код в нескольких файлах с использованием раздельной компиляции:

  1. Заголовочные файлы (example.h):
    • Содержат объявления функций, классов и переменных.
    • Защищены от множественного включения с помощью препроцессорных директив (#ifndef, #define, #endif)
  2. Исходные файлы (example.cpp):
    • Содержат реализации функций и методов, объявленных в заголовочных файлах.
    • Включают соответствующие заголовочные файлы для доступа к объявлениям.

Пример использования: Пример аддитивности с классами

Включения и правило одного определения (ODR)

  • Включения (include) в C++ позволяют включать содержимое одного файла в другой, что упрощает организацию кода и его повторное использование.

  • Правило одного определения (ODR) гласит, что в программе должно быть только одно определение каждой сущности (функции, переменной, класса и т.д.) во всех её юнитах трансляции. Исключением являются inline функции и шаблоны, которые могут иметь определения в нескольких юнитах трансляции.