Ich verwende .hpp, weil ich möchte, dass der Benutzer unterscheidet, welche Header C ++ - Header und welche Header C-Header sind.
Dies kann wichtig sein, wenn Ihr Projekt sowohl C- als auch C ++ - Module verwendet: Wie jemand anderes vor mir erklärt hat, sollten Sie dies sehr sorgfältig tun und es beginnt mit dem "Vertrag", den Sie über die Erweiterung anbieten
.hpp: C ++ - Header
(Oder .hxx oder .hh oder was auch immer)
Dieser Header ist nur für C ++.
Wenn Sie sich in einem C-Modul befinden, versuchen Sie nicht einmal, es einzuschließen. Sie werden es nicht mögen, weil keine Anstrengungen unternommen werden, um es C-freundlich zu machen (zu viel würde verloren gehen, wie Funktionsüberladung, Namespaces usw. usw.).
.h: C / C ++ - kompatible oder reine C-Header
Dieser Header kann direkt oder indirekt sowohl von einer C-Quelle als auch von einer C ++ - Quelle enthalten sein.
Es kann direkt aufgenommen werden und wird durch das __cplusplus
Makro geschützt :
- Dies bedeutet, dass aus C ++ - Sicht der C-kompatible Code definiert wird als
extern "C"
.
- Aus C-Sicht ist der gesamte C-Code deutlich sichtbar, der C ++ - Code wird jedoch ausgeblendet (da er in einem C-Compiler nicht kompiliert wird).
Zum Beispiel:
#ifndef MY_HEADER_H
#define MY_HEADER_H
#ifdef __cplusplus
extern "C"
{
#endif
void myCFunction() ;
#ifdef __cplusplus
} // extern "C"
#endif
#endif // MY_HEADER_H
Oder es könnte indirekt durch den entsprechenden .hpp-Header eingefügt werden, der der extern "C"
Deklaration beigefügt ist .
Zum Beispiel:
#ifndef MY_HEADER_HPP
#define MY_HEADER_HPP
extern "C"
{
#include "my_header.h"
}
#endif // MY_HEADER_HPP
und:
#ifndef MY_HEADER_H
#define MY_HEADER_H
void myCFunction() ;
#endif // MY_HEADER_H
Ich habe den
.hpp
Header immer als eine Art Portmanteau von.h
und.cpp
Dateien angesehen ... als Header, der auch Implementierungsdetails enthält.Wenn ich
.hpp
eine Erweiterung gesehen (und verwendet) habe , gibt es normalerweise keine entsprechende.cpp
Datei. Wie andere gesagt haben, ist dies keine feste Regel, nur wie ich dazu neige,.hpp
Dateien zu verwenden .quelle
Es spielt keine Rolle, welche Erweiterung Sie verwenden. Beides ist in Ordnung.
Ich benutze
*.h
für C und*.hpp
für C ++.quelle
EDIT [Vorschlag von Dan Nissenbaum hinzugefügt]:
Nach einer Konvention werden .hpp-Dateien verwendet, wenn die Prototypen im Header selbst definiert sind. Solche Definitionen in Headern sind bei Vorlagen nützlich, da der Compiler den Code für jeden Typ nur bei der Instanziierung von Vorlagen generiert. Wenn sie nicht in Header-Dateien definiert sind, werden ihre Definitionen zum Zeitpunkt der Verknüpfung nicht von anderen Kompilierungseinheiten aufgelöst. Wenn es sich bei Ihrem Projekt um ein C ++ - Projekt handelt, bei dem Vorlagen häufig verwendet werden, ist diese Konvention hilfreich.
Bestimmte Vorlagenbibliotheken, die dieser Konvention entsprechen, stellen Header mit .hpp-Erweiterungen bereit, um anzuzeigen, dass sie keine entsprechenden .cpp-Dateien haben.
Eine andere Konvention besteht darin, .h für C-Header und .hpp für C ++ zu verwenden. Ein gutes Beispiel wäre die Boost-Bibliothek.
quelle
Ich habe vor kurzem begonnen,
*.hpp
für C ++ - Header zu verwenden.Der Grund dafür ist, dass ich Emacs als primären Editor verwende und es beim Laden einer
*.h
Datei automatisch in den C-Modus und beim Laden einer Datei in den C ++ - Modus wechselt*.hpp
.Abgesehen davon , dass Tatsache , sehe ich keine guten Gründe für die Wahl
*.h
über*.hpp
oder umgekehrt.quelle
Ich beantworte dies als Erinnerung, um auf meine Kommentare zu "user1949346" zu verweisen, die auf dasselbe OP antworten.
So viele haben bereits geantwortet: So oder so ist es in Ordnung. Gefolgt von Hervorhebungen ihrer eigenen Eindrücke.
Einleitend, wie auch in den zuvor genannten Kommentaren angegeben, ist meine Meinung, dass
C++
Header-Erweiterungen vorgeschlagen werden,.h
wenn es tatsächlich keinen Grund dagegen gibt.Da die ISO / IEC-Dokumente diese Notation von Header-Dateien verwenden und
.hpp
in ihren Sprachdokumentationen über überhaupt keine Zeichenfolgenübereinstimmung mit auftrittC++
.Aber ich strebe jetzt einen akzeptablen Grund an, WARUM so oder so in Ordnung ist und insbesondere, warum es nicht Gegenstand der Sprache selbst ist.
Auf geht's.
Die
C++
Dokumentation (ich beziehe mich tatsächlich auf die Version N3690) definiert, dass ein Header der folgenden Syntax entsprechen muss:Wie wir aus diesem Teil extrahieren können, kann der Name der Header-Datei auch alles sein, was im Quellcode gültig ist. Außer
'\n'
Zeichen zu enthalten und je nachdem, ob es von eingeschlossen werden<>
soll, darf es kein enthalten>
. Oder umgekehrt, wenn es durch""
-include eingeschlossen ist, darf es kein a enthalten"
.Mit anderen Worten: Wenn Sie eine Umgebung hatten, die Dateinamen wie unterstützt
prettyStupidIdea.>
, ein Include wie:wäre gültig, aber:
wäre ungültig. Umgekehrt das Gleiche.
Und selbst
wäre ein gültiger inklusive Header-Dateiname.
Sogar das würde passen
C++
, es wäre eine ziemlich dumme Idee, tho.Und deshalb
.hpp
gilt auch.Aber es ist kein Ergebnis der Komitees, die Entscheidungen für die Sprache entwerfen!
So etwa zur Nutzung der Diskussion
.hpp
ist so , wie es zu tun.cc
,.mm
oder was auch immer , was ich in anderen Beiträgen zu diesem Thema lesen.Ich habe ich keine Ahnung , zugeben, wo
.hpp
herkommt 1 , aber ich würde ein Erfinder einiger Parsing - Tool, IDE oder etwas anderes mit betroffenen WetteC++
kam auf diese Idee , einige interne Prozesse zu optimieren oder einfach nur unbedingt für sie einige (wahrscheinlich sogar erfinden ) neue Namenskonventionen.Aber es ist nicht Teil der Sprache.
Und wann immer man sich entscheidet, es so zu benutzen. Möge es sein, weil er es am meisten mag oder weil einige Anwendungen des Workflows es erfordern, es ist nie 2 eine Anforderung der Sprache. Wer also sagt "das pp ist, weil es mit C ++ verwendet wird", ist einfach falsch in Bezug auf die Sprachdefinition.
C ++ erlaubt alles, was den vorherigen Absatz respektiert. Und wenn es etwas gibt, das das Komitee verwenden möchte, dann verwendet es es,
.h
da dies die Erweiterung ist, die in allen Beispielen des ISO-Dokuments verklagt wird.Fazit:
Solange Sie keine Notwendigkeit sehen / fühlen,
.h
Over.hpp
oder umgekehrt zu verwenden, sollten Sie sich nicht darum kümmern. Weil beide einen gültigen Headernamen gleicher Qualität in Bezug auf den Standard bilden würden. Und daher ist alles, was Sie verwenden müssen.h
oder.hpp
eine zusätzliche Einschränkung des Standards darstellt, die sogar anderen zusätzlichen Einschränkungen widersprechen könnte, die nicht miteinander übereinstimmen. Da OP jedoch keine zusätzlichen Spracheinschränkungen erwähnt, ist dies die einzig richtige und akzeptable Antwort auf die Frage" * .h oder * .hpp für Ihre Klassendefinitionen " lautet:
Beide sind gleichermaßen korrekt und anwendbar, solange keine externen Einschränkungen vorliegen.
1 Soweit ich weiß, ist es anscheinend das Boost-Framework, das diese
.hpp
Erweiterung entwickelt hat.2 Natürlich kann ich nicht sagen, was einige zukünftige Versionen mit sich bringen werden!
quelle
Ich bevorzuge .hpp für C ++, um sowohl den Editoren als auch anderen Programmierern klar zu machen, dass es sich eher um einen C ++ - Header als um eine C-Header-Datei handelt.
quelle
C ++ ("C Plus Plus") ist als .cpp sinnvoll
Header-Dateien mit der Erweiterung .hpp haben nicht den gleichen logischen Ablauf.
quelle
Sie können Ihre Includes nach Belieben aufrufen.
Sie müssen nur den vollständigen Namen im angeben
#include
.Ich schlage vor, wenn Sie mit C arbeiten
.h
und wann mit C ++ zu verwenden.hpp
.Es ist am Ende nur eine Konvention.
quelle
Codegear C ++ Builder verwendet .hpp für Header-Dateien, die automatisch aus Delphi-Quelldateien generiert werden, und .h-Dateien für Ihre "eigenen" Header-Dateien.
Wenn ich also eine C ++ - Headerdatei schreibe, verwende ich immer .h.
quelle
In einem meiner Jobs in den frühen 90ern haben wir .cc und .hh für Quell- bzw. Header-Dateien verwendet. Ich bevorzuge es immer noch allen Alternativen, wahrscheinlich weil es am einfachsten zu tippen ist.
quelle
Bjarne Stroustrup und Herb Sutter haben eine Erklärung zu dieser Frage in ihren C ++ Core-Richtlinien unter: https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#S-source, die sich auch auf die neuesten Änderungen bezieht in der Standarderweiterung (C ++ 11, C ++ 14 usw.)
Ich bin kein großer Fan dieser Konvention, denn wenn Sie eine beliebte Bibliothek wie Boost verwenden, ist Ihre Konsistenz bereits gebrochen und Sie sollten besser .hpp verwenden.
quelle
Wie viele hier bereits erwähnt haben, bevorzuge ich die Verwendung von .hpp auch für reine Header-Bibliotheken, die Vorlagenklassen / -funktionen verwenden. Ich bevorzuge die Verwendung von .h für Header-Dateien, die von .cpp-Quelldateien oder gemeinsam genutzten oder statischen Bibliotheken begleitet werden.
Die meisten Bibliotheken, die ich entwickle, sind vorlagenbasiert und müssen daher nur Header sein. Beim Schreiben von Anwendungen neige ich jedoch dazu, die Deklaration von der Implementierung zu trennen und am Ende .h- und .cpp-Dateien zu erhalten
quelle
Zum Glück ist es einfach.
Sie sollten die Erweiterung .hpp verwenden, wenn Sie mit C ++ arbeiten, und Sie sollten .h für C verwenden oder C und C ++ mischen.
quelle
Ich verwende .h, weil Microsoft dies verwendet und den Codegenerator erstellt. Keine Notwendigkeit, gegen den Strich zu gehen.
quelle
In "The C ++ Programming Language, Dritte Ausgabe von Bjarne Stroustrup", dem C ++ - Buch Nr. 1, das man unbedingt lesen muss, verwendet er * .h. Daher gehe ich davon aus, dass die beste Vorgehensweise darin besteht, * .h zu verwenden.
* .Hpp ist aber auch in Ordnung!
quelle
.hpp
die Sprache selbst überhaupt nichts davon erwähnt .Werkzeuge und Menschen können leicht etwas unterscheiden . Das ist es.
Bei der herkömmlichen Verwendung (durch Boost usw.)
.hpp
handelt es sich speziell um C ++ - Header. Auf der anderen Seite.h
ist für Nicht-C ++ - nur Header (hauptsächlich C). Die Sprache des Inhalts genau zu erkennen, ist im Allgemeinen schwierig, da es viele nicht triviale Fälle gibt. Dieser Unterschied macht es daher oft einfach, ein gebrauchsfertiges Tool zu schreiben. Für Menschen ist es nach Erhalt der Konvention auch leicht zu merken und leicht zu bedienen.Ich möchte jedoch darauf hinweisen, dass die Konvention selbst nicht immer wie erwartet funktioniert.
.hpp
selbst ist nicht die einzige Wahl. Warum nicht.hh
oder.hxx
? (Trotzdem benötigen Sie normalerweise mindestens eine herkömmliche Regel für Dateinamen und Pfade.)Ich persönlich benutze beide
.h
und.hpp
in meinen C ++ - Projekten. Ich folge der obigen Konvention nicht, weil:.h
Dateien auf github.com. (Es mag etwas in Kommentaren wie shebang geben, dass diese Quelldateien bessere Metadaten sind, aber es ist sogar nicht konventionell wie Dateinamen, also auch im Allgemeinen nicht zuverlässig.)Normalerweise verwende ich
.hpp
auf C ++ Header und die Header sollten (gehalten) in einem verwendet werden Kopf nur Art und Weise, zB als Template - Bibliotheken. Für andere Header in.h
gibt es entweder eine entsprechende.cpp
Datei als Implementierung oder einen Nicht-C ++ - Header. Letzteres ist trivial, um durch den Inhalt des Headers von Menschen (oder bei Bedarf von Tools mit explizit eingebetteten Metadaten) zu unterscheiden.quelle
Die Erweiterung der Quelldatei kann für Ihr Build-System von Bedeutung sein. Beispielsweise haben Sie möglicherweise eine Regel in Ihrem Makefile für
.cpp
oder in Ihren.c
Dateien, oder Ihr Compiler (z. B. Microsoftcl.exe
) kompiliert die Datei je nach Erweiterung möglicherweise als C oder C ++.Da Sie der
#include
Direktive den gesamten Dateinamen angeben müssen, ist die Header-Dateierweiterung irrelevant. Sie können eine.c
Datei in eine andere Quelldatei aufnehmen, wenn Sie möchten, da es sich nur um eine Textaufnahme handelt. Ihr Compiler hat möglicherweise die Option, die vorverarbeitete Ausgabe/P
zu sichern, um dies zu verdeutlichen (Microsoft: Vorverarbeitung in Datei,/E
Vorverarbeitung instdout
,/EP
Weglassen von#line
Anweisungen,/C
Beibehalten von Kommentaren)Sie können sich
.hpp
für Dateien entscheiden, die nur für die C ++ - Umgebung relevant sind, dh Funktionen verwenden, die in C nicht kompiliert werden können.quelle
Eine bestimmte Erweiterung hat keinen Vorteil, außer dass diese möglicherweise eine andere Bedeutung für Sie, den Compiler und / oder Ihre Tools hat.
header.h
ist ein gültiger Header.header.hpp
ist ein gültiger Header.header.hh
ist ein gültiger Header.header.hx
ist ein gültiger Header.h.header
ist ein gültiger Header.this.is.not.a.valid.header
ist ein gültiger Header in Ablehnung.ihjkflajfajfklaf
ist ein gültiger Header. Solange der Name vom Compiler ordnungsgemäß analysiert werden kann und das Dateisystem ihn unterstützt, ist er ein gültiger Header, und der einzige Vorteil seiner Erweiterung besteht darin, was man in ihn einliest.Abgesehen davon ist es sehr nützlich, Annahmen basierend auf der Erweiterung genau treffen zu können. Daher ist es ratsam, ein leicht verständliches Regelwerk für Ihre Header-Dateien zu verwenden. Persönlich mache ich lieber so etwas:
.h
. Es gibt keine Mehrdeutigkeit..h
, während ein Kopf kompatibel mit C ++ , aber nicht C bekommt.hpp
oder.hh
oder etwas dergleichen.Dies ist natürlich nur eine von vielen Möglichkeiten, mit Erweiterungen umzugehen, und Sie können Ihrem ersten Eindruck nicht unbedingt vertrauen, selbst wenn die Dinge einfach erscheinen. Ich habe zum Beispiel erwähnt, dass die Verwendung
.h
für normale Header und.tpp
für Header, die nur Definitionen für Elementfunktionen für Vorlagenklassen enthalten, wobei.h
Dateien, die Vorlagenklassen definieren, einschließlich usw., immer ein C ++ - Header sind. Und wieder einmal verwenden einige Leute.tpp
Dateien, die ihre Elementfunktionen definieren (anstelle der.h
Kopfzeile, die beide direkt enthält Funktionsdeklaration und Definition). Zum Beispiel spiegeln viele Leute immer die Sprache des Headers in seiner Erweiterung wider, auch wenn keine Möglichkeit für Mehrdeutigkeiten besteht. für sie.h
ist immer ein C-Header und.hpp
(oder.hh
, oder.hxx
.h
für "Header, der einer Quelldatei zugeordnet ist" und.hpp
für "Header mit allen inline definierten Funktionen".In Anbetracht dessen würde der Hauptvorteil darin bestehen, Ihre Header konsistent im gleichen Stil zu benennen und diesen Stil für jeden, der Ihren Code untersucht, leicht erkennbar zu machen. Auf diese Weise kann jeder, der mit Ihrem üblichen Codierungsstil vertraut ist, mit nur einem flüchtigen Blick feststellen, was Sie mit einer bestimmten Erweiterung meinen.
quelle