← Назад к вопросам

Почему в header не пишут код?

2.2 Middle🔥 151 комментариев
#Сборка и инструменты

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Почему в header не пишут код?

Это один из фундаментальных принципов организации C/C++ проектов.

1. Предотвращение multiple definition ошибок

В C/C++ действует правило One Definition Rule (ODR). Если функция определена в header, и этот header включен в несколько .cpp файлов, компилятор попытается определить функцию несколько раз:

// bad.h
void print() {  // ОПРЕДЕЛЕНИЕ, не декларация
    cout << "Hello" << endl;
}

// file1.cpp
#include "bad.h"

// file2.cpp
#include "bad.h"
// ОШИБКА: multiple definition of 'print'

Исключение — inline функции и шаблоны (templates).

2. Разделение интерфейса и реализации

Это базовый принцип инкапсуляции:

// math.h — интерфейс
void add(int a, int b);

// math.cpp — реализация
void add(int a, int b) {
    return a + b;
}

На изменение реализации не влияет клиентский код. Это позволяет скрывать сложные детали и менять алгоритмы.

3. Время компиляции

Если весь код в header, то при каждом include он перекомпилируется. При разделении на header + .cpp:

  • Header компилируется для каждого .cpp один раз
  • .cpp компилируются параллельно
  • Реальная реализация компилируется один раз

Это значительно ускоряет сборку больших проектов.

4. Управление видимостью символов

// math.h — публичный интерфейс
int publicFunction();

// math.cpp — скрытая реализация
static int helperFunction() {  // Видна только в этом файле
    return 42;
}

Клиентский код не видит вспомогательные функции.

5. Бинарная совместимость

При разделении header/cpp — клиент подключает header, а реальный код берёт из скомпилированной библиотеки (.so или .lib). Обновление библиотеки работает прозрачно без переПроверяй'ации клиентов.

6. Паттерн Pimpl (Pointer to Implementation)

// good.h
class MyClass {
private:
    class Impl;
    unique_ptr<Impl> impl;
public:
    void doSomething();
};

// good.cpp
class MyClass::Impl {
    // Сложная реализация полностью скрыта
};

Когда код ВСЕ-ТАКИ пишут в header

Inline функции, шаблоны, constexpr:

inline int max(int a, int b) { return a > b ? a : b; }

template<typename T>
T getMax(T a, T b) { return a > b ? a : b; }

constexpr int MAX_SIZE = 100;

Вывод

Разделение code на header (интерфейс) и .cpp (реализация) обеспечивает:

  • Оптимизацию компиляции
  • Инкапсуляцию и скрытие деталей
  • Гибкость в обновлении кода
  • Соответствие правилам языка (ODR)
  • Лучшую архитектуру проекта

Это не просто соглашение, а необходимость для масштабируемых и производительных C/C++ приложений.

Почему в header не пишут код? | PrepBro