Найти в Дзене
Sannariok

Хедер файлы в с++

Разбираемся что за хедеры и как их использовать, а как не надо. (сорри, но дзен не даёт вставлять удобно код) Header-файлы (заголовочные файлы) содержат объявления (но не определения) функций, классов и переменных, которые могут использоваться в нескольких .cpp файлах. Они помогают разделять интерфейс и реализацию, улучшая читаемость и повторное использование кода. ``` #ifndef HEADER_H // Защита от повторного включения #define HEADER_H void printMessage(); // Объявление функции #endif // HEADER_H ``` ПРИМЕР ПЛОХОГО ХЕДЕРА ``` #ifndef HEADER_H #define HEADER_H #include <iostream> // Плохо: тянем ненужный заголовочный файл std::string globalString = "Hello"; // Плохо: определение переменной void printMessage() { // Плохо: определение функции std::cout << globalString << std::endl; } #endif // HEADER_H ``` Это вызовет ошибку линковки при включении header.h в нескольких .cpp файлах. Лучший вариант: Правильный header.h (только объявления) ``` #ifndef HEADER_H #define HEADER_H #in
Оглавление

Введение:

Разбираемся что за хедеры и как их использовать, а как не надо. (сорри, но дзен не даёт вставлять удобно код)

Как работают header-файлы в C/C++

Header-файлы (заголовочные файлы) содержат объявления (но не определения) функций, классов и переменных, которые могут использоваться в нескольких .cpp файлах. Они помогают разделять интерфейс и реализацию, улучшая читаемость и повторное использование кода.

```

#ifndef HEADER_H // Защита от повторного включения
#define HEADER_H
void printMessage(); // Объявление функции
#endif // HEADER_H

```

Почему плохо делать #include в хедер?

  1. Долгое время компиляции

    Если заголовочный файл включает другие заголовочные файлы, они могут многократно включаться в разные .cpp файлы, что увеличивает время компиляции.
  2. Проблема множественного включения

    Если заголовочный файл включается в нескольких местах, а в нем есть определение переменных или функций, это вызовет ошибку компоновки.
  3. Неявные зависимости

    Файл может тянуть в проект ненужные зависимости, что делает код менее управляемым.

ПРИМЕР ПЛОХОГО ХЕДЕРА

```

#ifndef HEADER_H
#define HEADER_H
#include <iostream> // Плохо: тянем ненужный заголовочный файл
std::string globalString = "Hello"; // Плохо: определение переменной
void printMessage() { // Плохо: определение функции
std::cout << globalString << std::endl;
}
#endif // HEADER_H

```

Это вызовет ошибку линковки при включении header.h в нескольких .cpp файлах.

Лучший вариант:

  • В .h – только объявления.
  • В .cpp – определения.
  • Использовать #pragma once или #ifndef для защиты от повторного включения.

Правильный header.h (только объявления)

```

#ifndef HEADER_H
#define HEADER_H
#include <string> // Подключаем только то, что необходимо
// Объявление функции (без определения!)
void printMessage(const std::string& message);
#endif // HEADER_H

```

```

#include "header.h"
#include <iostream> // Подключаем реализацию здесь, а не в заголовочном файле
void printMessage(const std::string& message) {
std::cout << message << std::endl;
}

```

Почему это хороший заголовочный файл?

Содержит только объявления – нет ненужных определений переменных или функций.

Минимальные зависимости – #include <iostream> используется в .cpp, а не в .h.

Защита от повторного включения – #ifndef HEADER_H.

Разделение интерфейса и реализации – логика вынесена в .cpp, заголовок просто объявляет.

Такой подход делает код удобным для повторного использования и уменьшает время компиляции.

Следите за моими стримами на твиче (https://www.twitch.tv/koda_game_studio)