6 Stimmen

Was sind die Nachteile der Verwendung von C++-Headern (.h) gegenüber Headern plus Implementierung (.h + .cpp)?

Als unerfahrener C++-Programmierer habe ich meine Klassenschnittstelle immer in .h Dateien und Implementierung in .cpp Dateien. Allerdings habe ich vor kurzem versucht, C # für eine Weile und ich wirklich wie seine saubere Syntax und die Art und Weise zu organisieren Dateien, insbesondere gibt es keine Unterscheidung zwischen Header und Implementierung, Sie in der Regel eine Klasse für jeden implementieren .cs Datei und Sie brauchen keine Kopfzeilen.

Ich weiß, dass dies in C++ auch möglich ist (Sie können "Inline"-Funktionen in .h Dateien), aber bis jetzt habe ich immer eine klare Unterscheidung gesehen zwischen .h y .cpp Dateien in C++-Projekten. Was sind die Vor- und Nachteile dieses Ansatzes?

Dankeschön

1voto

Nim Punkte 32693

Ich würde mich @wheaties anschließen und einige weitere Punkte hinzufügen

  1. Die Kompilierung ist einfacher (vielleicht liegt es an mir), ich habe es noch nie geschafft, die Kompilierung richtig hinzubekommen, wenn man nur den Header modifiziert (wie in allen Implementierungsdateien, die ihn enthalten haben). Ich glaube, dass man in Makefiles die Abhängigkeiten manuell hinzufügen muss, was bei sehr großen Projekten sehr mühsam ist (kann auch nur an mir liegen). Wenn Sie also Ihren Code in Implementierungsdateien haben, dann bedeuten Änderungen einfach, dass Sie diese spezielle Datei neu kompilieren müssen - sehr nützlich, wenn Sie schnelle Änderungen vornehmen, bauen und testen wollen.

  2. Lassen Sie mich den Aspekt des Versteckens noch einmal betonen. Meistens möchte man nicht, dass die Leute die Implementierungsdetails kennen, weil der Code sensibel ist, und legt daher nur die Header und die vorgefertigten Bibliotheken offen, und die Trennung ist hier der Schlüssel.

  3. Vorwärtsdeklarationen, ein netter Trick, bei dem man die Implementierungsdetails einer Klasse nicht in die Header-Datei aufnehmen muss, wenn sie in keinem der Codes im Header "verwendet" wird, aber in der Implementierungsdatei kann man dann den echten Header einfügen und "alles funktioniert wunderbar" (hilft, wenn man zyklische Abhängigkeiten hat - warum man sie hat, ist eine andere Frage!)

1voto

Jay Punkte 12869

Bei einem kürzlich durchgeführten großen Projekt hatten die Autoren der Systeme, die ich verwenden wollte, einen großen Teil des Codes in .h-Dateien abgelegt. Als ich ihre .h-Dateien in meinen eigenen Quellcode einfügte, wurden meiner Datei weitere Abhängigkeiten hinzugefügt. Nachdem ich die Abhängigkeiten für ihr Projekt eingebunden hatte, kam es zu Typdef-Kollisionen. Hätten sie den Code getrennt und nur Deklarationen in der .h-Datei platziert, wäre es viel einfacher gewesen. Ich schlage vor, Posix-Typen zu verwenden und Deklarationen nur in .h-Dateien abzulegen.

0voto

chrisaycock Punkte 34286

Ich sehe, dass viele Antworten eine Trennung befürworten, vor allem wegen der Vorteile bei der Erstellung und Implementierung, die sich dahinter verbergen. Beide sind definitiv Pluspunkte, obwohl ich das Gegenbeispiel argumentieren wird: Boost .

Die meisten Boost-Bibliotheken verwenden eine .hpp Datei ohne externe Verlinkung. Der Grund dafür ist, dass dies im Falle von Schablonen oft erforderlich ist, wenn der Compiler die Argumenttypen aus der aufrufenden Routine kennen muss. Sie haben also möglicherweise keine andere Wahl, wenn Sie sich an den "modernen" C++-Ansatz halten wollen, Klassen für Vorlagen zu meiden.

0voto

0xC0000022L Punkte 19207

Was den Vergleichsteil von .cs gegen .cpp / .h Ich denke, Sie müssen den Hintergrund des leitenden Architekten von C# im Auge behalten: Anders Hejlsberg . In Delphi gibt es auch keine Unterscheidung zwischen Header und Modul (ohne Berücksichtigung der Include-Dateien für diese Diskussion). Sie haben einfach zwei Abschnitte in einer Unit-Datei initialization y implementation .

Die anderen Punkte wurden bereits erwähnt.

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