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

730voto

David Holm Punkte 16524

Es gibt einige Gründe für die unterschiedliche Benennung von C- und C++-Headern:

  • Automatische Code-Formatierung: Sie haben möglicherweise unterschiedliche Richtlinien für die Formatierung von C- und C++-Code. Wenn die Kopfzeilen durch eine Erweiterung getrennt sind, können Sie Ihren Editor so einstellen, dass er die entsprechende Formatierung automatisch vornimmt
  • Ich habe an Projekten mitgewirkt, bei denen Bibliotheken in C geschrieben wurden und dann Wrapper in C++ implementiert wurden. Da die Header in der Regel ähnliche Namen hatten, z. B. Feature.h vs. Feature.hpp, waren sie leicht zu unterscheiden.
  • Vielleicht gibt es für Ihr Projekt geeignetere Versionen, die in C++ geschrieben sind, aber Sie verwenden die C-Version (siehe obigen Punkt). Wenn Header nach der Sprache benannt sind, in der sie implementiert sind, können Sie alle C-Header leicht erkennen und nach C++-Versionen suchen.

Zur Erinnerung: C ist pas C++, und es kann sehr gefährlich sein, sie zu kombinieren, wenn man nicht weiß, was man tut. Die korrekte Benennung der Quellen hilft Ihnen, die Sprachen zu unterscheiden.

339voto

paercebal Punkte 78198

Ich verwende .hpp, weil ich möchte, dass der Benutzer unterscheiden kann, welche Header C++-Header und welche C-Header sind.

Dies kann wichtig sein, wenn Ihr Projekt sowohl C- als auch C++-Module verwendet: Wie schon jemand anderes vor mir erklärt hat, sollten Sie dies sehr sorgfältig tun, und es beginnt mit dem "Vertrag", den Sie durch die Erweiterung anbieten

.hpp : C++ Kopfzeilen

(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 gar nicht erst, es einzubinden. Sie werden es nicht mögen, weil keine Anstrengungen unternommen werden, 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 sowohl von einer C-Quelle als auch von einer C++-Quelle direkt oder indirekt eingebunden werden.

Sie kann direkt einbezogen werden, indem sie durch die __cplusplus Makro:

  • Das bedeutet, dass aus Sicht von C++ der C-kompatible Code wie folgt definiert wird extern "C" .
  • Aus der Sicht von C ist der gesamte C-Code deutlich sichtbar, während der C++-Code verborgen bleibt (da er in einem C-Compiler nicht kompiliert werden kann).

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 er könnte indirekt durch den entsprechenden .hpp-Header eingeschlossen werden, der ihn mit dem extern "C" Erklärung.

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

74voto

Perculator Punkte 1163

Ich war immer der Meinung, dass die .hpp Header ist eine Art Portmanteau aus .h y .cpp Dateien...ein Header, der auch Implementierungsdetails enthält.

Typischerweise, wenn ich gesehen habe (und verwende) .hpp als Erweiterung, gibt es keine entsprechende .cpp Datei. Wie andere schon sagten, ist dies keine feste Regel, sondern nur eine Art, wie ich sie zu verwenden pflege .hpp Dateien.

53voto

Burkhard Punkte 14363

Es spielt keine Rolle, welche Erweiterung Sie verwenden. Beide sind in Ordnung.

Ich benutze *.h für C und *.hpp für C++.

48voto

ProgramCpp Punkte 1102

EDITAR [Vorschlag von Dan Nissenbaum hinzugefügt]:

Eine Konvention besagt, dass .hpp-Dateien verwendet werden, wenn die Prototypen im Header selbst definiert sind. Solche Definitionen in Headern sind im Falle von Vorlagen nützlich, da der Compiler den Code für jeden Typ nur bei der Instanziierung der Vorlage erzeugt. Wenn sie also nicht in Header-Dateien definiert sind, werden ihre Definitionen zur Link-Zeit von anderen Kompiliereinheiten nicht aufgelöst. Wenn es sich bei Ihrem Projekt um ein reines C++-Projekt handelt, das viel Gebrauch von Templates macht, ist diese Konvention nützlich.

Bestimmte Vorlagenbibliotheken, die sich an diese Konvention halten, bieten Header mit .hpp-Erweiterungen, um anzuzeigen, dass sie keine entsprechenden .cpp-Dateien haben.

Eine andere Konvention ist die Verwendung von .h für C-Header und .hpp für C++; ein gutes Beispiel ist die boost-Bibliothek.

Zitat aus den Boost FAQ,

Dateierweiterungen geben den "Typ" der Datei an, sowohl für Menschen und für Computerprogramme. Die Erweiterung ".h" wird für C-Header-Dateien verwendet Dateien verwendet und kommuniziert daher das Falsche über C++-Header Dateien. Die Verwendung keiner Erweiterung kommuniziert nichts und zwingt zur Überprüfung des Dateiinhalts, um den Typ zu bestimmen. Die Verwendung von '.hpp' weist eindeutig eindeutig als C++-Header-Datei identifiziert und funktioniert in der Praxis gut. (Rainer Deyke)

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