Ostatnia aktualizacja: 26 lutego 2026

Podczas pisania programów w C++, szczególnie w dużych projektach, organizowanie kodu w wielu plikach jest niezbędne dla czytelności i utrzymania. Zwykle wiąże się to z używaniem plików nagłówkowych, które mają rozszerzenia .h lub .hpp. Ale jaka jest różnica między tymi dwoma i którego powinieneś używać?
W tym artykule przedstawimy różnice między plikami .h i .hpp, przyjrzymy się ich historii i udzielimy wskazówek dotyczących najlepszych praktyk.
Zrozumienie plików nagłówkowych w C++
Pliki nagłówkowe zawierają deklaracje funkcji, klas, stałych i makr, które możesz dołączać w wielu plikach źródłowych. Pliki te są następnie włączane do plików .cpp (źródłowych C++) za pomocą dyrektywy #include.
Typowa zawartość plików nagłówkowych
- Definicje klas
- Deklaracje funkcji
- Definicje stałych
- Makra
- Szablony (w niektórych przypadkach)
Pliki .h
Co to jest plik .h?
.h to tradycyjne pliki nagłówkowe, które po raz pierwszy szeroko zastosowano w języku programowania C. Są nadal używane zarówno w projektach C, jak i C++ do deklarowania interfejsów.
Przykład użycia:
// mathutils.h
#ifndef MATHUTILS_H
#define MATHUTILS_H
int add(int a, int b);
int subtract(int a, int b);
#endif
Zalety:
- Uniwersalnie rozpoznawane (używane zarówno w C, jak i C++).
- Odpowiednie dla projektów zawierających kod zarówno w C, jak i C++.
Wady:
- Może powodować niejasności w projektach C++ co do tego, czy plik jest w stylu C, czy C++.
Pliki .hpp
Co to jest plik .hpp?
.hpp to specyficzne dla C++ pliki nagłówkowe. Działają tak samo jak pliki .h, ale są używane do wyraźnego wskazania, że nagłówek jest przeznaczony dla kodu C++.
Przykład użycia:
// vectorutils.hpp
#ifndef VECTORUTILS_HPP
#define VECTORUTILS_HPP
#include <vector>
std::vector<int> filter_even(const std::vector<int>& input);
#endif
Zalety:
- Wyraźnie wskazuje, że plik jest przeznaczony dla kodu C++.
- Unika nieporozumień przy mieszaniu C i C++.
- Przydatne w projektach wielojęzykowych lub zespołach stosujących ścisłe konwencje nazewnictwa.
Wady:
- Nieco mniej powszechne w starszych bazach kodu.
- Nie rozpoznawane przez niektóre starsze systemy oczekujące rozszerzenia
.h.
.h vs .hpp: Kluczowe różnice
| Cecha | Plik .h | Plik .hpp |
|---|---|---|
| Powiązanie językowe | C i C++ | Tylko C++ |
| Konwencja czy reguła? | Konwencja | Konwencja |
| Użycie w projektach C++ | Powszechne | Preferowane przez niektórych dla przejrzystości |
| Obsługa szablonów | Tak | Tak |
| Niejasność kodu | Możliwe w projektach wielojęzycznych | Mniej prawdopodobne |
Najlepsze praktyki wyboru między .h a .hpp
Oto kilka ogólnych wytycznych, które pomogą Ci dokonać wyboru:
Użyj .h, jeśli:
- Piszesz kod, który musi być kompatybilny zarówno z C, jak i C++.
- Utrzymujesz lub rozwijasz starszy kod, który już używa
.h.
Użyj .hpp, jeśli:
- Chcesz jasno zaznaczyć, że plik jest specyficzny dla C++.
- Pracujesz w projekcie wyłącznie C++ lub używasz specyficznych dla C++ funkcji, takich jak klasy, szablony i przestrzenie nazw.
Typowe struktury projektu
Przykład z .h:
project/
├── main.cpp
├── mathutils.h
└── mathutils.cpp
Przykład z .hpp:
project/
├── main.cpp
├── vectorutils.hpp
└── vectorutils.cpp
Obie struktury są poprawne; różnica wynika głównie z przejrzystości i preferencji zespołu.
Wnioski
Wybór między .h a .hpp to w dużej mierze kwestia konwencji, a nie funkcjonalności. Oba służą temu samemu celowi: deklarowaniu interfejsów i współdzielonego kodu w wielu plikach źródłowych C++.
Jednak w przypadku kodu specyficznego dla C++ użycie .hpp może wyraźniej określić Twoje intencje i pomóc uniknąć nieporozumień w większych bazach kodu — szczególnie tych obejmujących wiele języków. W projektach mieszanych lub starszych .h może nadal być właściwym wyborem.
Najważniejsze wnioski:
Używaj
.hpp, gdy chcesz zaznaczyć „to jest wyłącznie kod C++” — trzymaj się.h, jeśli pracujesz w środowiskach łączących C i C++.