Раздельная компиляция в C++ — это методология организации кода, которая позволяет компилировать исходный код программы по частям (юнитам трансляции), а затем объединять эти части в один исполняемый файл или библиотеку. Основная цель раздельной компиляции — ускорение времени сборки проекта и упрощение его поддержки.
Юнит трансляции (translation unit) в C++ — это набор исходных файлов и всех включенных в них заголовочных файлов, которые компилируются вместе. Каждый юнит трансляции обрабатывается компилятором как единое целое.
Разбиение кода на интерфейс и реализацию
-
Интерфейс: Объявления функций, классов, типов и констант, которые используются другими частями программы. Этот код обычно помещается в заголовочные файлы (
.h
,.hpp
). -
Реализация: Реализация функций и методов классов, которая содержит конкретные детали их работы. Этот код обычно помещается в исходные файлы (
.cpp
).
Организация кода в нескольких файлах
Чтобы организовать код в нескольких файлах с использованием раздельной компиляции:
- Заголовочные файлы (
example.h
):- Содержат объявления функций, классов и переменных.
- Защищены от множественного включения с помощью препроцессорных директив (
#ifndef
,#define
,#endif
)
- Исходные файлы (
example.cpp
):- Содержат реализации функций и методов, объявленных в заголовочных файлах.
- Включают соответствующие заголовочные файлы для доступа к объявлениям.
Пример использования: Пример аддитивности с классами
Включения и правило одного определения (ODR)
-
Включения (include) в C++ позволяют включать содержимое одного файла в другой, что упрощает организацию кода и его повторное использование.
-
Правило одного определения (ODR) гласит, что в программе должно быть только одно определение каждой сущности (функции, переменной, класса и т.д.) во всех её юнитах трансляции. Исключением являются
inline
функции и шаблоны, которые могут иметь определения в нескольких юнитах трансляции.