Warum müssen wir eine Header-Datei schreiben?

12

Ich weiß, bevor Sie Ihre snarky Kommentare herauspeitschen - das ist eine nooby Frage. Ich verwende zum ersten Mal eine C-basierte Sprache.

Ich bin ein Student, der Ziel C für einen Informatikkurs über mobile Entwicklung lernt. Ich weiß, dass in einem akademischen Umfeld viele reale Überlegungen nicht erforderlich sind, da Sie kleinere Projekte erstellen, in kleineren Teams arbeiten usw.

Unser Professor fordert jedoch - und XCode unterstützt - .h-Headerdateien für jede .m-Implementierungsdatei. Für mich scheint es eine Art beschäftigte Arbeit zu sein. Ich muss sicherstellen, dass ich jede Methodensignatur und Instanzvariable in die andere Datei kopiere. Wenn ich eine Datei ändere, muss ich sicherstellen, dass sie mit der anderen Datei übereinstimmt. Es scheint nur ein Haufen kleiner Ärger zu sein.

Aber ich weiß , es muss sein , einige der realen Welt Verwendung für Header - Dateien. Eine gute Antwort würde beide ansprechen:

  1. Wofür ist eine Header-Datei nützlich, für die eine Implementierungsdatei nicht geeignet ist? Was ist seine Aufgabe?
  2. Warum müssen wir als Programmierer unsere Header-Dateien manuell schreiben? Es scheint, als könnten sie leicht automatisch generiert werden.

Danke im Voraus!

Hartley Brody
quelle
Unterstützt XCode das automatische Refactoring, sodass beim Ändern einer Signatur im Header diese automatisch an die Implementierung weitergegeben wird (und umgekehrt)? Oder gibt es vielleicht ein Plugin, das das unterstützt? Ich weiß, dass es schmerzhaft ist, dies manuell zu tun.
FrustratedWithFormsDesigner
Meine erste Reaktion, als ich von Header-Dateien erfuhr, war "Es muss eine Möglichkeit geben, dies automatisch zu tun". Ich war ziemlich verwirrt, als ich nach einem Werkzeug suchte, das mir dabei helfen würde, und fand keine großartigen, offensichtlichen Möglichkeiten.
Hartley Brody
Ich bin überrascht, dass eine solche Funktionalität nicht existiert. Ich weiß, dass Eclipse ein solches Refactoring für Java durchführen kann. Ich weiß nicht, ob die C / C ++ - Plugins Header- / Impl-Refactoring durchführen können. Ich denke, wenn es für XCode kein solches Tool gibt, könnte es sich lohnen, es zu entwickeln. ;)
FrustratedWithFormsDesigner

Antworten:

9
  1. Zusamenfassend;

    • Die Header-Datei definiert die API für ein Modul. Es handelt sich um eine Vertragsliste, welche Methoden ein Dritter aufrufen kann. Das Modul kann als Black Box für Dritte betrachtet werden.

    • Die Implementierung implementiert das Modul. Es ist das Innere der Black Box. Als Entwickler eines Moduls müssen Sie dies schreiben, aber als Benutzer eines Moduls eines Drittanbieters sollten Sie nichts über die Implementierung wissen müssen. Der Header sollte alle Informationen enthalten, die Sie benötigen.

  2. Einige Teile einer Header-Datei könnten automatisch generiert werden - die Methodendeklarationen. Dies würde erfordern, dass Sie die Implementierung mit Anmerkungen versehen, da die Implementierung wahrscheinlich private Methoden enthält, die nicht Teil der API sind und nicht in den Header gehören.

Header-Dateien enthalten manchmal andere Informationen. Typdefinitionen, Konstantendefinitionen usw. Diese gehören in die Header-Datei und nicht in die Implementierung.

Luke Graham
quelle
Aber wann würde sich jemand in einer Situation befinden, in der er meinen Code verwenden musste, aber nur Zugriff auf die .h-Datei hatte? Würden sie nicht immer noch die .m brauchen, um es auszuführen?
Hartley Brody
1
Ich verstehe die Notwendigkeit einer Abstraktion auf theoretischer Ebene, falls Sie Implementierungsdetails ändern, bin mir aber nicht sicher, wann eine solche Situation eintreten würde.
Hartley Brody
10
Manchmal, normalerweise aus kommerziellen Gründen, möchten Sie möglicherweise jemandem erlauben, Ihren Code zu verwenden, haben jedoch keinen Zugriff auf Ihre Implementierung. In diesem Fall würden Sie eine Header-Datei und entweder einen bereits kompilierten Bibliotheks- oder Objektcode bereitstellen.
Luke Graham
Ahh, ich verstehe. Hatte nicht gedacht, dass der Code bereits kompiliert wäre, also verwendbar, aber nicht lesbar. Vielen Dank!
Hartley Brody
3
Warum sollte ich die Implementierung lesen wollen, um zu wissen, wie Sie Ihren Code verwenden? Es sollte ausreichen, die Header-Datei zu lesen.
Per Johansson
5

Der Hauptgrund für einen Header besteht darin, dass #includeer in einer anderen Datei verwendet werden kann, sodass Sie die Funktionen in einer Datei aus dieser anderen Datei verwenden können. Der Header enthält (nur) genug, um verwenden , um die Funktionen, die Funktionen nicht selbst, so (hoffentlich) Kompilieren es wesentlich schneller ist.

Die beiden getrennt voneinander zu pflegen, führt dazu, dass niemand jemals einen Editor geschrieben hat, der den Prozess sehr gut automatisiert. Es gibt nicht wirklich viele Gründe, warum sie dies nicht konnten, und einige haben es sogar versucht - aber die Redakteure, die dies getan haben, haben sich auf dem Markt nie sehr gut geschlagen, und die Mainstream-Redakteure haben es nicht übernommen.

Jerry Sarg
quelle
2

Durch das Einfügen eines Headers kann Ihr Code Funktionen oder Methoden aufrufen, die an anderer Stelle geschrieben wurden und möglicherweise Teil Ihres Softwareprojekts / Builds sind oder nicht, die jedoch beim Erstellen der Software vom Linker gefunden werden können.

Wenn Sie beispielsweise eine Funktion in der Standard-C-Bibliothek aufrufen, möchten Sie nicht alle Innereien dieser Funktion in Ihr Projekt einfügen müssen - Sie erwarten einfach, dass Ihr Programm sie aufrufen kann.

Ihrem Compiler muss jedoch mitgeteilt werden, dass die Funktion irgendwo vorhanden ist, auch wenn er den Code nicht sehen kann und der Header dies tut. Wenn der Compiler fertig ist, wird der Linker aufgerufen und versucht, die Teile Ihres Codes zu verknüpfen, die noch hängen bleiben, z. B. Bibliotheksaufrufe.

adrianmcmenamin
quelle
1

Header-Dateien werden hauptsächlich verwendet, um die Signaturen (dh Funktionsname, Rückgabewert und Argumente) Ihrer Funktionen in anderen Dateien zu deklarieren und einzuschließen. Der Compiler muss diese Signaturen kennen, wenn Sie Ihre Dateien kompilieren und miteinander verknüpfen.

Lesen Sie diesen Artikel für weitere Informationen.

Bernard
quelle