Frage

Ich verstehe nicht ganz den Punkt einen Kopf haben kann; es scheint das DRY-Prinzip zu verletzen! Alle Informationen in einem Header (können) bei der Umsetzung enthalten sind.

War es hilfreich?

Lösung

Es vereinfacht den Übersetzungsvorgang. Wenn Sie unabhängig Einheiten kompilieren wollen, müssen Sie etwas, die Teile zu beschreiben, die verknüpft werden, ohne die Gesamtheit aller anderen Dateien importieren zu müssen.

Es ermöglicht auch Code versteckt. Man kann einen Kopf verteilen zu anderen erlauben, die Funktionalität zu nutzen, ohne die Umsetzung zu verteilen zu haben.

Schließlich kann die Trennung der Schnittstelle von Implementierung fördern.

Sie sind nicht der einzige Weg, um diese Probleme zu lösen, aber vor 30 Jahren waren sie gut. Wir würden wahrscheinlich nicht die Header-Dateien für eine Sprache heute verwenden, aber sie waren im Jahr 2009 nicht erfunden.

Andere Tipps

Die Architekten von vielen modernen Sprachen wie Java, Eiffel und C # stimmen eindeutig mit Ihnen - diese Sprachen extrahieren Sie die Metadaten zu einem Modul aus der Umsetzung. Jedoch per se, das Konzept des Header nicht ausschließt, dass - es wäre natürlich eine einfache Aufgabe für einen Compiler, eine .h-Datei zu extrahieren, während eines .c, zum Beispiel kompiliert, genau wie die Compiler für diese anderen Sprachen implizit tun. Die Tatsache, dass typische aktuelle C-Compiler es nicht tun, ist keine Sprache Design-Problem - es ist ein Implementierungsproblem; offenbar gibt es keine Nachfrage von Nutzern für eine solche Funktion, so dass keine Compiler-Anbieter stört es zu implementieren.

Als Sprachdesignwahl, Dateien getrennt .h mit (in einem für Menschen lesbaren und bearbeitbaren Text-Format) gibt Ihnen das Beste aus beiden Welten: Sie können separat starten Kompilieren von Code-Client basiert auf einer Modul-Implementierung, die noch nicht existiert wenn Sie möchten, indem Sie die .h Datei von Hand zu schreiben; oder Sie (durch absurde einen Compiler Implementierung unter der Annahme, dass es liefert ;-) kann die .h Datei automatisch aus der Umsetzung als Nebenwirkung bekommt es zu kompilieren.

Wenn C, C ++, usw halten gedeihen (anscheinend sind sie noch heute wohlauf ;-), und die Nachfrage wie das Ihre für nicht manuell schreiben Header wächst, schließlich Schriftsteller Compiler haben die „Header Generation“ Option zu liefern, und das „beste aus beiden Welten“ wird nicht bleiben theoretisch! -)

Es hilft ein wenig über die Fähigkeiten des Computers zu denken, die verfügbar waren, wenn, sagen c, geschrieben wurde. Der Hauptspeicher wurde in Kiloworten gemessen und nicht notwendigerweise sehr viele von ihnen. Scheiben waren größer, aber nicht viel. Serrious Lagerung bedeutete Reel-to-Reel-Bänder, von Hand montiert, durch mürrische Betreiber, die wirklich wollte, dass du weg gehen, damit sie jagen die wumpus spielen könnte. A 1 MIPS Maschine war schreien schnell . Und mit all diesen Einschränkungen mussten Sie Aktien es. Möglicherweise mit einer Punktzahl von anderen Benutzern.

Alles, was den Raum reduziert oder Zeit Komplexität der Zusammenstellung war ein großer Gewinn. Und Header beides tun.

Vergessen Sie nicht, die Dokumentation ein Header zur Verfügung stellt. Es ist in der Regel alles, was darin Sie für die Verwendung des Moduls wissen müssen. Ich für meinen Teil möchte nicht über eine looong Quelltext scannen, um zu erfahren, was es ist, dass ich verwenden müssen und wie man es nennen ... Sie würden diese Informationen ohnehin extrahieren, die effektiv ergibt - eine Header-Datei. Nicht mehr ein Problem mit modernen IDEs, natürlich, aber die Arbeit mit einigen alten C-Code ich wirklich liebe handgefertigte Header-Dateien zu haben, die Kommentare über die Nutzung und über Vor- umfassen und Nachbedingungen.

Keeping Quelle, Kopf- und zusätzliche Dokumentation synchron noch eine weitere Dose Würmer ...

Die ganze Idee der binären Ausgabedateien von Sprachprozessoren von Inspektion wäre schwer zu verstehen gewesen, wenn C .h Dateien erfunden. Es war ein System namens JOVIAL , die so etwas wie es tat, aber es war exotisch und beschränkt mehr- oder weniger ausschließlich auf militärische Projekte. (Ich habe noch nie ein joviales Programm gesehen, ich habe davon nur gehört.)

Also, wenn C das übliche Design-Muster für Modularität herauskommt, war „keine Kontrollen überhaupt“. Es könnte eine Einschränkung sein, die Symbole .text konnte nur Link .text und .data .DATA, aber das war es. Das heißt, in der Regel die Compiler des Tages zu einer Zeit, eine Quelldatei verarbeitet und Linker sie dann zusammengefügt, ohne die geringste Maß an Fehlerprüfung außer, wenn man Glück hat, „Ich bin ein Funktionssymbol“ vs „Ich bin ein Datensymbol“.

So ist die Idee der eigentlich mit der Compiler die Sache verstehen Sie war etwas neu forderten.

Auch heute, wenn Sie einen total gefälschten Header machen, fängt man niemand in den meisten AOT-Compiler . Clever Dinge wie CLR Sprachen und Java tatsächlich tun kodieren, was in den Klassendateien.

Also ja, auf lange Sicht, werden wir wahrscheinlich nicht die Header-Dateien haben.

Nein nicht du Header in Java haben - aber Sie haben Schnittstellen haben und ich jeden ernsthaften Java Guru empfiehlt Ihnen etwas von anderen Projekten / Systeme als Schnittstelle und eine Implementierung verwendet definieren

. Definition enthält Anruf Signaturen, Typdefinitionen und Inhalte auch

Ermöglicht eine Java-Schnittstelle zu sehen.

Die meisten C-Header-Dateien enthalten Call-Signaturen, Typdefinitionen und Konstanten.

Also für alle pratical Zwecke C / C ++ Header-Dateien sind nur Schnittstellendefinitionen und sollte daher eine gute Sache angesehen werden. Jetzt weiß ich, seine möglich, eine Vielzahl anderer Dinge in Header-Dateien zu definieren, als auch (MARCROs, Konstanten etc. etc.), aber das ist nur ein Teil des Ganzen wunderbare Welt der C: -

int function target () {
    // Default for shoot
    return FOOT;
}

Für Details Lesen Sie dieser

Eine Header-Datei häufig enthält zukunftsgerichtete Aussagen Erklärungen von Klassen, Subroutinen, Variablen und andere Identifizierungsmerkmale. Programmierer, die standardisierten Kennungen in mehr als eine Quelldatei deklarieren wollen solche Kennungen in einer einzigen Header-Datei platzieren können, die anderen Code kann dann schließen, wenn die Header-Inhalte erforderlich sind.

Die C-Standardbibliothek und Standardbibliothek C ++ traditionell ihre Standardfunktionen in Header-Dateien deklariert werden.

Und was, wenn Sie jemand anderes die Erklärungen geben, Ihre Bibliothek zu nutzen, ohne sie die Umsetzung zu geben?

Als ein andere Antwort weist darauf hin - der ursprüngliche Grund für Header war das Parse / kompiliert leichter auf Plattformen mit sehr einfachen und begrenzten Werkzeugen zu machen. Es war ein großer Schritt nach vorn, eine Maschine mit zwei Floppy-Discs haben, so dass Sie den Compiler auf der einen und der Code auf der anderen Seite haben könnte -. Machte die Dinge viel einfacher

Wenn Sie Code in Header und Quelldateien teilen teilen Sie Deklaration und Definition. Wenn Sie in Header-Dateien können Sie sehen, was Sie haben und wenn Sie winden gehen Sie Implementierungsdetails sehen Datei zu beziehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top