76 Stimmen

Sollte C++ Header-Dateien eliminieren?

Viele Sprachen wie Java, C# trennen Deklaration und Implementierung nicht. C# hat ein Konzept der teilweisen Klasse, aber Implementierung und Deklaration bleiben dennoch in der gleichen Datei.

Warum hat C++ nicht das gleiche Modell? Ist es praktischer, Kopfdateien zu haben?

Ich beziehe mich auf aktuelle und kommende Versionen des C++-Standards.

14 Stimmen

Ich glaube, es gibt keinen wirklichen Grund für Headerdateien in C++. Alle darin gespeicherten Informationen sind im .cpp dupliziert und können automatisch extrahiert werden (wie von www.lazycplusplus.com demonstriert - Haftungsausschluss: nicht verwendet). Das Problem ist die Kompilierungsgeschwindigkeit und C#&Java haben gezeigt, dass dies überwindbar ist.

0 Stimmen

Wie kann www.lazycplusplus.com alle Informationen erhalten? Was ist, wenn ich einen void-Pointer in der Header-Datei für zukünftige Verwendung deklarieren und reservieren wollte? Es wird nie in der cpp-Datei verwendet oder referenziert.

1 Stimmen

THanks.... Ich habe auch keine Ahnung, warum es abgelehnt wurde.

82voto

Gavin Miller Punkte 41976

Rückwärtskompatibilität - Headerdateien werden nicht eliminiert, da dies die Rückwärtskompatibilität beeinträchtigen würde.

34voto

Steve Rowe Punkte 19335

Headerdateien ermöglichen eine unabhhängige Kompilierung. Sie brauchen nicht auf die Implementierungsdateien zuzugreifen oder sie überhaupt zu haben, um eine Datei zu kompilieren. Dies kann zu einfacheren verteilten Builds führen.

Dies ermöglicht es auch, SDKs etwas einfacher zu machen. Sie können nur die Header und einige Bibliotheken bereitstellen. Natürlich gibt es auch andere Sprachen, die um dies herum arbeiten.

17 Stimmen

Offensichtlich ist Benutzerfreundlichkeit kein Grund für Überschriften, da sie schwer zu pflegen sind, doppelter Code und für ein SDK automatisch extrahiert werden können. Verteilte Builds sind meiner Meinung nach ein richtiger Punkt.

3 Stimmen

Sie könnten problemlos eine unabhängige Kompilierung ohne Headerdateien durchführen.

12 Stimmen

Ich würde behaupten, dass C++-Header NICHT die Implementierung von der Schnittstelle trennen. Um eine echte Trennung zu erreichen, musst du PIMPL oder eine ähnliche Abstraktion verwenden.

32voto

Max Lybbert Punkte 19181

Selbst Bjarne Stroustrup hat Header-Dateien als Flickwerk bezeichnet.

Aber ohne ein standardisiertes Binärformat, das die erforderlichen Metadaten enthält (wie Java-Klassendateien oder .Net-PE-Dateien), sehe ich keine Möglichkeit, das Feature zu implementieren. Ein bereinigtes ELF- oder a.out-Binär enthält nicht viele Informationen, die Sie extrahieren müssten. Und ich glaube nicht, dass die Informationen jemals in Windows-XCOFF-Dateien gespeichert werden.

6 Stimmen

Ich würde Herrn Stroustrup ernster nehmen, wenn er die Headerdateien erfunden hätte. Dann würde er seinen Fehler eingestehen, anstatt die Sprache schlecht zu machen, für die er sich ausdrücklich entschieden hat, rückwärtskompatibel zu bleiben. Es ist, als ob man beschließt, einen Oktopus zu machen und sich dann darüber beschwert, wie viele Tentakel man daran setzen muss.

0 Stimmen

Ich würde Herrn Stroustrup ernster nehmen, wenn er einen Compiler schreiben könnte. Dann könnte er beliebige Informationen in die Objektdateien schreiben, unabhängig vom Format oder dem Entfernen von Informationen.

2 Stimmen

C++-Header sind hässlich. In gut geschriebenem C-Code sind Header großartig - private Implementierungsdetails in einer Quelldatei sind wirklich privat und werden überhaupt nicht offenbart, für niemanden.

20voto

Marc Bernier Punkte 2868

Ich wechsle routinemäßig zwischen C# und C++, und das Fehlen von Headerdateien in C# ist eines meiner größten Ärgernisse. Ich kann mir eine Headerdatei ansehen und alles lernen, was ich über eine Klasse wissen muss - wie ihre Memberfunktionen heißen, ihre Aufrufsyntax usw. - ohne durch Seiten des Codes zu waten, der die Klasse implementiert.

Und ja, ich kenne die teilweisen Klassen und #regions, aber es ist nicht dasselbe. Teilweise Klassen machen das Problem sogar schlimmer, weil eine Klassendefinition über mehrere Dateien verteilt ist. Was die #regions betrifft, sie werden nie so erweitert, wie ich es gerne hätte für das, was ich gerade tue, also muss ich Zeit damit verbringen, diese kleinen Pluszeichen zu erweitern, bis ich die Ansicht richtig habe.

Vielleicht wenn Visual Studios Intellisense für C++ besser arbeiten würde, hätte ich keinen zwingenden Grund, so oft auf .h-Dateien verweisen zu müssen, aber selbst in VS2008 kann C++'s Intellisense nicht mit der von C# mithalten

157 Stimmen

Sie führen die Aufgabe der Maschine durch, Dokumentation auszulesen, und genießen es. Wow...

27 Stimmen

In Java/C# verwenden Sie Schnittstellen, um die API anzuzeigen. Dies ist ein VIEL bessere Möglichkeit, die API anzuzeigen als eine Kopfzeile. Eine separate Klassendatei wird als Implementierung verwendet.

3 Stimmen

Kts, nun haben Sie normalerweise nicht für alles Schnittstellen. Ein Großteil der API befindet sich in konkreten Klassen. Sie zeigen die API normalerweise mit einem speziellen Dokumentations-Extraktionswerkzeug, entweder eines, das HTML generiert oder in der IDE eingebettet ist (Object Explorer in VS)

17voto

Abhay Punkte 6851

In The Design and Evolution of C++, gibt Stroustrup noch einen weiteren Grund...

Dieselbe Headerdatei kann zwei oder mehr Implementierungsdateien haben, die gleichzeitig von mehr als einem Programmierer bearbeitet werden können, ohne dass ein Quellcodeverwaltungssystem erforderlich ist.

Dies mag heutzutage seltsam erscheinen, aber ich denke, es war ein wichtiges Thema, als C++ erfunden wurde.

1 Stimmen

Auch mit einem Source-Control-System macht es die Arbeit an getrennten Dateien sicher einfacher, Zusammenführungen zu vereinfachen.

11 Stimmen

+1 für Die gleiche Headerdatei kann zwei oder mehr Implementierungsdateien haben. Das ist ein Segen für die Erstellung einer portablen Anwendung ohne den Missbrauch von #ifdef-fu. (Verwenden Sie einfach ein Makefile, das das richtige myclass.o aus den plattformabhängigen myclass-win.cpp / myclass-linux.cpp generiert, und der Rest kümmert sich nur um myclass.h)

0 Stimmen

Dies ist in der Tat seltsam und sollte heutzutage überhaupt nicht als Grund diskutiert werden. Es ist Geschichte.

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