Последнее обновление: 26 Feb, 2026

При написании программ на C++, особенно в крупных проектах, организация кода в несколько файлов необходима для читаемости и поддержки. Обычно это делается с помощью заголовочных файлов, которые имеют расширения .h или .hpp. Но в чём разница между ними и какой из них следует использовать?
В этой статье мы разберём различия между файлами .h и .hpp, изучим их историю и дадим рекомендации по лучшим практикам.
Понимание заголовочных файлов в C++
Заголовочные файлы содержат объявления функций, классов, констант и макросов, которые можно включать в несколько исходных файлов. Эти файлы затем включаются в файлы .cpp (исходники C++) с помощью директивы #include.
Обычное содержание заголовочных файлов
- Определения классов
- Объявления функций
- Определения констант
- Макросы
- Шаблоны (в некоторых случаях)
Файлы .h
Что такое файл .h?
.h — традиционные заголовочные файлы, впервые широко использованные в языке C. Они продолжают использоваться как в проектах на C, так и на C++ для объявления интерфейсов.
Пример использования:
// mathutils.h
#ifndef MATHUTILS_H
#define MATHUTILS_H
int add(int a, int b);
int subtract(int a, int b);
#endif
Плюсы:
- Универсально распознаются (используются и в C, и в C++).
- Подходят для проектов, включающих как код на C, так и на C++.
Минусы:
- Может вызывать неоднозначность в проектах C++ относительно того, является ли файл C‑стилем или C++‑стилем.
Файлы .hpp
Что такое файл .hpp?
.hpp — заголовочные файлы, специфичные для C++. Они работают так же, как файлы .h, но явно указывают, что заголовок предназначен для кода C++.
Пример использования:
// vectorutils.hpp
#ifndef VECTORUTILS_HPP
#define VECTORUTILS_HPP
#include <vector>
std::vector<int> filter_even(const std::vector<int>& input);
#endif
Плюсы:
- Чётко указывает, что файл предназначен для C++.
- Избегает путаницы при смешивании C и C++.
- Полезно в проектах с несколькими языками или в командах, придерживающихся строгих правил именования.
Минусы:
- Немного реже встречается в старых кодовых базах.
- Не поддерживается некоторыми устаревшими системами, ожидающими расширение
.h.
.h vs .hpp: Ключевые различия
| Особенность | Файл .h | Файл .hpp |
|---|---|---|
| Языковая привязка | C и C++ | Только C++ |
| Конвенция или правило? | Конвенция | Конвенция |
| Использование в проектах C++ | Распространено | Предпочтительно для некоторых из соображений ясности |
| Поддержка шаблонов | Да | Да |
| Неоднозначность кода | Возможна в проектах с несколькими языками | Менее вероятно |
Лучшие практики выбора между .h и .hpp
Используйте .h, если:
- Вы пишете код, который должен быть совместим как с C, так и с C++.
- Вы поддерживаете или расширяете наследованный код, уже использующий
.h.
Используйте .hpp, если:
- Вы хотите явно указать, что файл предназначен только для C++.
- Вы работаете в проекте, использующем исключительно C++ или применяете специфичные для C++ возможности, такие как классы, шаблоны и пространства имён.
Общие структуры проекта
Пример с .h:
project/
├── main.cpp
├── mathutils.h
└── mathutils.cpp
Пример с .hpp:
project/
├── main.cpp
├── vectorutils.hpp
└── vectorutils.cpp
Обе структуры допустимы; различие в основном связано с ясностью и предпочтениями команды.
Заключение
Выбор между .h и .hpp в основном вопрос конвенции, а не функциональности. Оба типа служат одной цели: объявлять интерфейсы и общий код для множества файлов‑исходников C++.
Тем не менее, для кода, специфичного к C++, использование .hpp может сделать ваши намерения более очевидными и помочь избежать путаницы в больших кодовых базах — особенно в проектах, включающих несколько языков. Для проектов с смешанными языками или наследованных кодовых баз .h всё ещё может быть предпочтительным вариантом.
Ключевой вывод:
Используйте
.hpp, когда хотите явно указать «это только код C++» — оставайтесь с.h, если работаете в средах, где смешиваются C и C++.