761 Stimmen

*.h oder *.hpp für Ihre Klassendefinitionen

Ich habe immer eine *.h Datei für meine Klassendefinitionen, aber nachdem ich den Code einiger Boost-Bibliotheken gelesen hatte, stellte ich fest, dass sie alle *.hpp . Ich hatte schon immer eine Abneigung gegen diese Dateierweiterung, vor allem, weil ich sie nicht gewohnt bin.

Was sind die Vor- und Nachteile der Verwendung von *.hpp en *.h ?

2 Stimmen

Inzwischen gibt es Die C++ Core Guidelines die eindeutig *.h empfehlen

1 Stimmen

@Christophe Ich würde nicht sagen, dass der Standard "eindeutig" *.h empfiehlt. Sie überlassen es den Projektkonventionen: SF.1: Use a .cpp suffix for code files and .h for interface files if your project doesn’t already follow another convention

4voto

Enzo Punkte 982

Wie viele hier bereits erwähnt haben, bevorzuge ich auch die Verwendung von .hpp für reine Header-Bibliotheken, die Template-Klassen/-Funktionen verwenden. Ich bevorzuge .h für Header-Dateien, die von .cpp-Quelldateien oder gemeinsam genutzten oder statischen Bibliotheken begleitet werden.

Die meisten der Bibliotheken, die ich entwickle, basieren auf Vorlagen und müssen daher nur Header sein, aber wenn ich Anwendungen schreibe, neige ich dazu, die Deklaration von der Implementierung zu trennen und lande bei .h- und .cpp-Dateien

3voto

Mark Ransom Punkte 283960

Ich verwende .h, weil Microsoft das verwendet und der Codegenerator das erzeugt. Kein Grund, gegen den Strom zu schwimmen.

2voto

In "The C++ Programming Language, Third Edition by Bjarne Stroustrup", dem C++-Buch Nr. 1, das man unbedingt gelesen haben muss, verwendet er *.h. Ich gehe also davon aus, dass es die beste Praxis ist, *.h zu verwenden.

Aber auch *.hpp ist in Ordnung!

2voto

Mike Dimmick Punkte 9542

Die Erweiterung der Quelldatei kann eine Bedeutung für Ihr Build-System haben, zum Beispiel könnten Sie eine Regel in Ihrem Makefile für .cpp o .c Dateien, oder Ihr Compiler (z.B. Microsoft cl.exe ) kann die Datei je nach Erweiterung als C oder C++ kompilieren.

Da Sie den gesamten Dateinamen an die #include ist die Erweiterung der Header-Datei irrelevant. Sie können eine .c Datei in eine andere Quelldatei einbinden, denn es handelt sich nur um ein textuelles Include. Ihr Compiler verfügt möglicherweise über eine Option zum Ausgeben der vorverarbeiteten Ausgabe, die dies deutlich macht (Microsoft: /P zur Vorverarbeitung in eine Datei, /E zur Vorverarbeitung zu stdout , /EP auszulassen #line Richtlinien, /C um Kommentare beizubehalten)

Sie können Folgendes verwenden .hpp für Dateien, die nur für die C++-Umgebung relevant sind, d.h. sie verwenden Funktionen, die in C nicht kompiliert werden können.

2voto

Es gibt keinen Vorteil für eine bestimmte Erweiterung, außer dass sie für Sie, den Compiler und/oder Ihre Werkzeuge eine andere Bedeutung haben kann. header.h ist eine gültige Kopfzeile. header.hpp ist eine gültige Kopfzeile. header.hh ist eine gültige Kopfzeile. header.hx ist eine gültige Kopfzeile. h.header ist eine gültige Kopfzeile. this.is.not.a.valid.header ist eine gültige Kopfzeile in Verweigerung. ihjkflajfajfklaf ist eine gültige Kopfzeile. Solange der Name vom Compiler richtig geparst werden kann und das Dateisystem ihn unterstützt, ist er ein gültiger Header, und der einzige Vorteil seiner Erweiterung ist das, was man in ihn hineinliest.

Dennoch ist es wichtig, auf der Grundlage der Verlängerung genaue Annahmen treffen zu können. sehr nützlich, daher wäre es ratsam, für Ihre Headerdateien leicht verständliche Regeln zu verwenden. Ich persönlich ziehe es vor, etwas wie dies zu tun:

  1. Wenn es bereits festgelegte Leitlinien gibt, sollten Sie diese befolgen, um Verwirrung zu vermeiden.
  2. Wenn alle Quelldateien im Projekt für dieselbe Sprache sind, verwenden Sie .h . Es gibt keine Zweideutigkeit.
  3. Wenn einige Header mit mehreren Sprachen kompatibel sind, während andere nur mit einer einzigen Sprache kompatibel sind, basieren die Erweiterungen auf der restriktivsten Sprache, mit der ein Header kompatibel ist. Ein Header, der mit C oder sowohl mit C als auch mit C++ kompatibel ist, erhält .h , während ein Header, der mit C++, aber nicht mit C kompatibel ist, .hpp o .hh oder etwas in der Art.

Dies ist natürlich nur eine der viele Es gibt viele Möglichkeiten, mit Verlängerungen umzugehen, und man kann sich nicht unbedingt auf den ersten Eindruck verlassen, selbst wenn die Dinge einfach erscheinen. Ich habe zum Beispiel gesehen, dass die Verwendung von .h für normale Kopfzeilen, und .tpp für Header, die nur Definitionen für Memberfunktionen von Vorlagenklassen enthalten, mit .h Dateien, die Vorlagenklassen definieren, einschließlich der .tpp Dateien, die ihre Mitgliedsfunktionen definieren (anstelle der .h Kopfzeile, die sowohl die Funktionsdeklaration als auch die Definition direkt enthält). Ein weiteres Beispiel ist, dass viele Leute immer die Sprache des Headers in seiner Erweiterung wiedergeben, selbst wenn es keine Möglichkeit der Mehrdeutigkeit gibt, .h ist immer ein C-Header und .hpp (o .hh または .hxx usw.) ist immer ein C++-Header. Und noch einmal, einige Leute verwenden .h für "Header in Verbindung mit einer Quelldatei" und .hpp für "Kopfzeile mit allen inline definierten Funktionen".

Der Hauptvorteil besteht darin, dass Sie Ihre Kopfzeilen durchgängig im gleichen Stil benennen und dass dieser Stil für jeden, der Ihren Code untersucht, leicht erkennbar ist. Auf diese Weise kann jeder, der mit Ihrem üblichen Codierungsstil vertraut ist, mit einem flüchtigen Blick feststellen, was Sie mit einer bestimmten Erweiterung meinen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X