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

21voto

dhein Punkte 6063

Ich antworte hierauf als Erinnerung, um auf meine Kommentare zu der Antwort von "user1949346" auf dieselbe OP hinzuweisen.


Wie schon viele geantwortet haben: beides ist in Ordnung. Gefolgt von der Betonung der eigenen Eindrücke.

Einleitend, wie auch in den zuvor genannten Kommentaren dargelegt, ist meine Meinung C++ Kopfzeilenerweiterungen werden vorgeschlagen als .h wenn es eigentlich keinen Grund dagegen gibt.

Da die ISO/IEC-Dokumente diese Notation von Header-Dateien verwenden und kein String-Matching zu .hpp sogar in ihren Sprachdokumentationen über C++ .

Aber ich versuche jetzt, einen akzeptablen Grund zu finden, warum eine der beiden Möglichkeiten in Ordnung ist, und vor allem, warum sie nicht Gegenstand der Sprache selbst ist.

Also, los geht's.

En C++ Dokumentation (ich beziehe mich hier auf die Version N3690) definiert, dass ein Header der folgenden Syntax entsprechen muss:

2.9 Kopfzeilennamen

header-name:
    < h-char-sequence >
    " q-char-sequence "
h-char-sequence:
    h-char
    h-char-sequence h-char
h-char:
    any member of the source character set except new-line and >
q-char-sequence:
    q-char
    q-char-sequence q-char
q-char:
    any member of the source character set except new-line and "

Wie wir aus diesem Teil entnehmen können, kann der Name der Header-Datei alles sein, was auch im Quellcode gültig ist. Außer, dass er '\n' Zeichen und je nachdem, ob sie von <> darf es nicht enthalten eine > . Oder andersherum, wenn sie von "" -include darf es nicht enthalten " .

Mit anderen Worten: Wenn Sie eine Umgebung hätten, die Dateinamen wie prettyStupidIdea.> einschließen, wie:

#include "prettyStupidIdea.>"

wäre gültig, aber:

#include <prettyStupidIdea.>>

wäre ungültig. Umgekehrt gilt das Gleiche.

Und selbst

#include <<.<>

wäre ein gültiger Name für eine einbindbare Header-Datei.

Auch dies würde mit der C++ Das wäre allerdings eine ziemlich dumme Idee.

Und das ist der Grund .hpp ist ebenfalls gültig.

Aber das ist nicht das Ergebnis der Entscheidungen der Ausschüsse, die die Sprache gestalten!

So diskutieren Sie über die Verwendung von .hpp ist dasselbe wie über .cc , .mm oder was ich sonst noch in anderen Beiträgen zu diesem Thema gelesen habe.

Ich muss zugeben, dass ich keine Ahnung habe, wo .hpp kam von 1 aber ich würde darauf wetten, dass ein Erfinder eines Parsing-Tools, einer IDE oder etwas anderem, das mit C++ kamen auf diese Idee, um einige interne Prozesse zu optimieren oder einfach einige (wahrscheinlich sogar für sie notwendige) neue Namenskonventionen zu erfinden.

Aber es ist nicht Teil der Sprache.

Und wann immer man sich entscheidet, sie auf diese Weise zu nutzen. Sei es, weil es ihm am besten gefällt oder weil einige Anwendungen des Arbeitsablaufs es erfordern, ist es nie 2 ist eine Anforderung der Sprache. Wer also sagt, "das pp ist, weil es mit C++ verwendet wird", liegt einfach falsch in Bezug auf die Definition der Sprache.

C++ erlaubt alles, was dem vorherigen Absatz entspricht. Und wenn es etwas gibt, das der Ausschuss vorgeschlagen hat, dann ist es die Verwendung von .h da dies die Erweiterung ist, die in allen Beispielen des ISO-Dokuments verwendet wird.

Schlussfolgerung:

Solange Sie keine Notwendigkeit sehen/fühlen, die .h en .hpp oder umgekehrt, sollten Sie sich die Mühe nicht machen. Denn beides wäre ein gültiger Kopfname von gleicher Qualität in Bezug auf die Norm. Und deshalb ist alles, was ERFORDERLICH Sie zu verwenden .h o .hpp ist eine zusätzliche Einschränkung der Norm, die sogar mit anderen zusätzlichen Einschränkungen, die nicht miteinander übereinstimmen, im Widerspruch stehen könnte. Da der Auftraggeber jedoch keine zusätzliche sprachliche Einschränkung erwähnt, ist dies die einzig richtige und zulässige Antwort auf die Frage

" *.h oder *.hpp für Ihre Klassendefinitionen " ist:

Beide sind gleichermaßen richtig und anwendbar, solange keine äußeren Beschränkungen vorliegen.


1 Soviel ich weiß, ist es offenbar der Boost-Rahmen, der das hervorgebracht hat <code>.hpp</code> Erweiterung.

2 Natürlich kann ich nicht sagen, was zukünftige Versionen mit sich bringen werden!

19voto

Serge Punkte 7578

Ich benutze seit kurzem *.hpp für C++-Kopfzeilen.

Der Grund dafür ist, dass ich emacs als meinen primären Editor benutze und er automatisch in den c-Modus wechselt, wenn man eine *.h Datei und in den C++-Modus, wenn Sie eine *.hpp Datei.

Abgesehen von dieser Tatsache sehe ich keine guten Gründe für die Wahl *.h en *.hpp oder andersherum.

12voto

slashmais Punkte 6901

Sie können Ihr Include nennen, wie Sie wollen.

Sie müssen nur den vollständigen Namen in der #include .

Ich schlage vor, dass Sie, wenn Sie mit C arbeiten, die .h und wann mit C++ zu verwenden .hpp .

Letztendlich ist es nur eine Konvention.

8voto

JohnMcG Punkte 8423

Ich bevorzuge .hpp für C++, um sowohl für Editoren als auch für andere Programmierer deutlich zu machen, dass es sich um einen C++-Header und nicht um eine C-Header-Datei handelt.

7voto

Nykal Punkte 149

Zum Glück ist es ganz einfach.

Sie sollten die Erweiterung .hpp verwenden, wenn Sie mit C++ arbeiten, und Sie sollten .h für C oder eine Mischung aus C und C++ verwenden.

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