Останнє оновлення: 26 лютого, 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++.