Ostatnia aktualizacja: 26 lutego 2026

Tytuł - .h vs .hpp: Jaka jest różnica i którego używać?

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

CechaPlik .hPlik .hpp
Powiązanie językoweC i C++Tylko C++
Konwencja czy reguła?KonwencjaKonwencja
Użycie w projektach C++PowszechnePreferowane przez niektórych dla przejrzystości
Obsługa szablonówTakTak
Niejasność koduMożliwe w projektach wielojęzycznychMniej 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++.

Zobacz także