Senast uppdaterad: 26 Feb, 2026

När du skriver C++‑program, särskilt i stora projekt, är det viktigt att organisera koden i flera filer för läsbarhet och underhåll. Detta innebär vanligtvis att man använder header‑filer, som har filändelserna .h eller .hpp. Men vad är skillnaden mellan dessa två, och vilken bör du använda?
I den här artikeln går vi igenom skillnaderna mellan .h‑ och .hpp‑filer, utforskar deras historia och ger råd om bästa praxis.
Förstå header‑filer i C++
Header‑filer innehåller deklarationer för funktioner, klasser, konstanter och makron som du kan inkludera i flera källkodsfiler. Dessa filer inkluderas sedan i .cpp‑filer (C++‑källkod) med #include‑direktivet.
Vanligt innehåll i header‑filer
- Klassdefinitioner
- Funktionsdeklarationer
- Konstantdefinitioner
- Makron
- Mallar (i vissa fall)
.h‑filer
Vad är en .h‑fil?
.h‑filer är traditionella header‑filer och användes först i stor utsträckning i C‑programmeringsspråket. De används fortfarande i både C‑ och C++‑projekt för att deklarera gränssnitt.
Exempel på användning:
// mathutils.h
#ifndef MATHUTILS_H
#define MATHUTILS_H
int add(int a, int b);
int subtract(int a, int b);
#endif
Fördelar:
- Universellt igenkända (används i både C och C++).
- Lämpliga för projekt som innehåller både C‑ och C++‑kod.
Nackdelar:
- Kan skapa tvetydighet i C++‑projekt om filen är C‑stil eller C++‑stil.
.hpp‑filer
Vad är en .hpp‑fil?
.hpp‑filer är C++‑specifika header‑filer. De fungerar på samma sätt som .h‑filer men används för att explicit ange att headern är avsedd för C++‑kod.
Exempel på användning:
// vectorutils.hpp
#ifndef VECTORUTILS_HPP
#define VECTORUTILS_HPP
#include <vector>
std::vector<int> filter_even(const std::vector<int>& input);
#endif
Fördelar:
- Anger tydligt att filen är avsedd för C++‑kod.
- Undviker förvirring när C och C++ blandas.
- Hjälpsamt i projekt med flera språk eller team som följer strikta namngivningskonventioner.
Nackdelar:
- Något mindre vanligt i äldre kodbaser.
- Känns inte igen av vissa äldre system som förväntar sig
.h.
.h vs .hpp: Viktiga skillnader
| Funktion | .h‑fil | .hpp‑fil |
|---|---|---|
| Språkassociation | C och C++ | Endast C++ |
| Konvention eller regel? | Konvention | Konvention |
| Användning i C++‑projekt | Vanligt | Föredras av vissa för tydlighet |
| Stöd för mallar | Ja | Ja |
| Kodambiguitet | Möjlig i projekt med flera språk | Mindre sannolikt |
Bästa praxis för att välja mellan .h och .hpp
Här är några allmänna riktlinjer för att hjälpa dig välja:
Använd .h om:
- Du skriver kod som måste vara kompatibel med både C och C++.
- Du underhåller eller utökar äldre kod som redan använder
.h.
Använd .hpp om:
- Du vill göra det tydligt att filen är C++‑specifik.
- Du arbetar i ett renodlat C++‑projekt eller använder C++‑specifika funktioner som klasser, mallar och namnrymder.
Vanliga projektstrukturer
Exempel med .h:
project/
├── main.cpp
├── mathutils.h
└── mathutils.cpp
Exempel med .hpp:
project/
├── main.cpp
├── vectorutils.hpp
└── vectorutils.cpp
Båda strukturerna är giltiga; skillnaden ligger främst i tydlighet och teampreferenser.
Slutsats
Valet mellan .h och .hpp handlar i stor utsträckning om konvention, inte funktionalitet. Båda fyller samma syfte: att deklarera gränssnitt och delad kod över flera C++‑källfiler.
För C++‑specifik kod kan användning av .hpp göra dina avsikter tydligare och hjälpa till att undvika förvirring i större kodbaser—särskilt de som involverar flera språk. För projekt med blandade språk eller äldre kod kan .h fortfarande vara vägen att gå.
Viktig slutsats:
Använd
.hppnär du vill signalera “detta är endast C++‑kod” — håll dig till.hom du arbetar i miljöer där C och C++ blandas.