.h oder .hpp für C++-Header-Dateien? Wir klären es ein für alle Mal
Wenn Sie jemals länger als ein paar Wochen in C++ programmiert haben, sind Sie bestimmt auf diese Frage gestoßen. Sie öffnen ein fremdes Projekt – dort steht .h. Sie beginnen Ihr eigenes – und eine Stimme in Ihrem Kopf sagt: „Vielleicht ist .hpp cooler?“. Oder umgekehrt: Sie sind ein glühender Fan von .h, während ein Kollege behauptet, dass .hpp der einzig wahre Weg sei.
Spoiler: Beide Varianten sind technisch korrekt. Dem Compiler ist es egal. Aber es gibt einen Unterschied, und dieser ist wichtig für die Code-Organisation, Lesbarkeit und Projektwartung. Lassen Sie uns klären, was hinter diesen beiden Erweiterungen steckt und wann man welche wählt.
Kurze Antwort: Was ist der grundlegende Unterschied?
Ganz kurz zusammengefasst:
.h– die traditionelle Erweiterung für Header-Dateien, aus C stammend. Wird sowohl in C als auch in C++ verwendet..hpp– eine modernere Erweiterung, die explizit anzeigt: „Das ist C++, nicht C“. Entwickelt, um C++-Header von C-Headern zu unterscheiden.
Aber der Teufel steckt, wie immer, im Detail. Gehen wir tiefer.
Historischer Kontext: Woher kommen .h und .hpp?
Die Sprache C verwendet .h für Header seit jeher. Als C++ aufkam, verwendeten Programmierer zunächst einfach weiter .h – und das ist völlig in Ordnung. Die C++-Standardbibliothek (z. B. <iostream>) hat sogar ganz auf Erweiterungen verzichtet, aber das ist eine andere Geschichte.
Die Erweiterung .hpp entstand als Antwort auf die Notwendigkeit, C- und C++-Code zu trennen. Stellen Sie sich vor: Sie haben ein großes Projekt, bei dem ein Teil der Dateien in C und ein Teil in C++ geschrieben ist. Sie kompilieren es möglicherweise mit verschiedenen Compilern oder mit unterschiedlichen Flags. Wie erkennen Sie schnell, welcher Header für welche Sprache ist? Richtig – durch einen Blick auf die Erweiterung.
So wurde .hpp (von „C Plus Plus header“) zum De-facto-Standard in der Community für reine C++-Header, insbesondere in Bibliotheken wie Boost.
Wann verwendet man .h?
Überstürzen Sie nicht die Abkehr von .h. Es hat seine Stärken:
- Kompatibilität mit C. Wenn Ihre Header-Datei sowohl aus C- als auch aus C++-Code eingebunden werden soll – nur
.h. Keine Alternative. - Konservative Projekte. In großen Codebasen, in denen sich ein Stil über Jahre etabliert hat, ist ein Wechsel zu
.hppunnötiger Aufwand. - Minimalismus. Drei Zeichen statt vier. Eine Kleinigkeit, aber angenehm.
Beispiel: Ein mit C und C++ kompatibler Header
// math_utils.h#ifndef MATH_UTILS_H#define MATH_UTILS_H
#ifdef __cplusplusextern "C" {#endif
int add(int a, int b);int multiply(int a, int b);
#ifdef __cplusplus}#endif
#endif // MATH_UTILS_HEine solche Datei kann sowohl in .c als auch in .cpp eingebunden werden. Wenn Sie sie math_utils.hpp nennen würden, könnte ein C-Programmierer verwirrt sein: „Ist das wirklich für mich?“.
Wann verwendet man .hpp?
Hier ist es genau umgekehrt: .hpp ist die Wahl des modernen C++-Programmierers. Besonders wenn:
- Sie nur in C++ schreiben. Es gibt kein C im Projekt und wird es auch nie geben.
- Sie Templates, STL, Exceptions verwenden. Das sind reine C++-Features, und die Erweiterung
.hppunterstreicht dies. - Sie C++-Code explizit von C trennen möchten. In gemischten Projekten verhindert dies Verwirrung.
- Sie modernen Praktiken folgen. Boost, Qt (teilweise), viele neue Bibliotheken verwenden
.hpp.
Beispiel: Ein typischer C++-Header mit einer Klasse
// player.hpp#ifndef PLAYER_HPP#define PLAYER_HPP
#include <string>#include <vector>
class Player {public: Player(const std::string& nam