Für Werkzeuge und Menschen ist es leicht zu unterscheiden etwas . Das war's.
Bei herkömmlicher Verwendung (durch Boosten usw.), .hpp
ist speziell C++-Header. Auf der anderen Seite, .h
ist für Kopfzeilen, die nicht nur aus C++ bestehen (hauptsächlich C). Die genaue Erkennung der Sprache des Inhalts ist im Allgemeinen schwierig, da es viele nicht-triviale Fälle gibt, so dass dieser Unterschied oft die Erstellung eines gebrauchsfertigen Tools erleichtert. Für Menschen, die die Konvention einmal verstanden haben, ist sie auch leicht zu merken und zu verwenden.
Ich möchte jedoch darauf hinweisen, dass die Konvention selbst nicht immer wie erwartet funktioniert.
- Sie wird nicht durch die Spezifikation von Sprachen erzwungen weder C noch C++. Es gibt viele Projekte, die sich nicht an diese Konvention halten. Sobald Sie sie zusammenführen (mischen) müssen, kann das mühsam sein.
.hpp
selbst ist nicht die einzige Wahl. Warum nicht .hh
o .hxx
? (Obwohl man normalerweise mindestens eine konventionelle Regel für Dateinamen und Pfade braucht).
Ich persönlich benutze beides .h
y .hpp
in meinen C++-Projekten. Ich halte mich nicht an die obige Konvention, weil:
- Die von den einzelnen Projektteilen verwendeten Sprachen sind ausdrücklich dokumentiert. Keine Möglichkeit, C und C++ im selben Modul (Verzeichnis) zu mischen. Jede Bibliothek von Drittanbietern muss diese Regel einhalten.
- Die konformen Sprachspezifikationen und die zulässigen Sprachdialekte, die von den Projekten verwendet werden, sind ebenfalls dokumentiert. (In der Tat dokumentiere ich sogar die Quelle der verwendeten Standardfunktionen und Fehlerbehebungen (für den Sprachstandard) .) Dies ist etwas wichtiger als die Unterscheidung der verwendeten Sprachen, da dies zu fehleranfällig ist und die Kosten für den Test (z.B. Compilerkompatibilität) erheblich sein können (kompliziert und zeitaufwendig), insbesondere bei einem Projekt, das bereits in fast rein C++. Dateinamen sind zu schwach, um dies zu handhaben.
- Selbst für denselben C++-Dialekt kann es wichtigere Eigenschaften geben, die für den Unterschied geeignet sind. Siehe zum Beispiel die folgende Konvention.
- Dateinamen sind im Wesentlichen Teile von fragilen Metadaten. Die Verletzung von Konventionen ist nicht so leicht zu erkennen. Um einen stabilen Umgang mit dem Inhalt zu gewährleisten, sollte ein Werkzeug schließlich nicht nur auf Namen angewiesen sein. Der Unterschied zwischen Erweiterungen ist nur ein Hinweis. Von Werkzeugen, die sie verwenden, sollte auch nicht erwartet werden, dass sie sich immer gleich verhalten, z. B. die Spracherkennung von
.h
Dateien auf github.com. (Es kann etwas in den Kommentaren stehen wie shebang für diese Quelldateien, um bessere Metadaten zu erhalten, aber sie sind auch nicht so konventionell wie Dateinamen, also im Allgemeinen auch nicht zuverlässig).
Ich verwende normalerweise .hpp
auf C++-Kopfzeilen und die Kopfzeilen sollten in einem Verzeichnis verwendet (gepflegt) werden. Nur für den Kopf z.B. in Form von Vorlagenbibliotheken. Für andere Kopfzeilen in .h
gibt es entweder eine entsprechende .cpp
Datei als Implementierung, oder es ist ein Nicht-C++-Header. Letzteres lässt sich anhand des Inhalts des Headers leicht von Menschen unterscheiden (oder von Tools mit explizit eingebetteten Metadaten, falls erforderlich).
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