Wofuer eigentlich ein Header-File?
-
Hallo,
bevor ich meine Frage(n) beginne, moechte ich mich zunaechst entschuldigen eine solche triviale Frage zu stellen, aber ich habe sowohl in der Literatur als auch im Netz nichts gefunden, was meinen Prof zufrieden stellen wird
Kurze Vorgeschichte
Bald schreibe ich im Rahmen meines Informatik-Studiums eine Klausur welche u.a. Grundlagen von C abfragt. Laut Aussage des Profs soll die Klausur nicht besonders schwer werden, da wir bereits eine relativ grosse Leistung in Form von Hausuebungen erbringen mussten.Als kleinen Vorgeschmack auf die Klausur erwaehnte er einige Fragen der letzten Klausuren, welche er alle als trivial abtat, woraufhin sich natuerlich niemand traute weiter nachzufragen.
Die Frage
Eine der Fragen die er in vorherigen Klausuren stellten war ***"Warum/wozu gibt es Header-Dateien?"***.Meine Probleme mit der Frage
Die Frage klingt jetzt erstmal nicht wirklich kompliziert. Klar, eine Headerdatei enthaelt Funktionsprototypen, typedefs, Makros und includes von anderen Headerdateien.Nun aber zu meinen Problemen: In der Lektuere liest man in der Regel, dass nur "oeffentliche" Funktionen auch in das Header-File kommen, mein Prof ist aber der Meinung das alle Funktionen (bzw. deren Prototyp) in das Header-File gehoeren. Laut seiner Aussage sind die Funktionen eines C-Files auch ohne Deklaration im Header sichtbar und koennen von aussen genutzt werden. Er sagte, dass nur das Schluesselwort static vor einer Funktion vor dem auesseren Aufruf schuetzt. Warum steht dann aber ueberall, dass nur oeffentliche Funktionen im Header-File bekannt gegeben werden?
Ausserdem hat er gefragt, warum ein C-File eigentlich das eigene Header-File includen muss. Ehrlich gesagt, faellt mir hierzu keine schluessige Antwort ein. Evtl. weil der Preprocessor die Definitionen aus dem Header-File nicht automatisch in das C-File uebernimmt und somit die Typen- und Markodefinitonen usw. nicht im C-File bekannt waeren?
Dann stellte er noch die Frage warum in eine Header-Datei keine Implementierung gehoert. Ehrlich gesagt, weiss ich auch hierrauf keine sichere Antwort. Legt der Binder sich evtl. auf die Nase weil nun mehrere C-Dateien die gleiche Funktion beinhalten?
Waere wirklich nett wenn ihr mir schluessige und verstaendliche Antworten geben koenntet, damit ich das C-Mysterium etwas besser verstehe
Gruss,
fish
-
also gehen mir mal davon aus, dass dein programm etwas größer wird, du packst
#define's
functions köpfe
typedef'sin die header datei und den rest in die *.c datei, die *.c datei benötigt natürlich die *.h datei da sie sonst nicht weiß wie die structuren und definitionen aussehen...
der grund dieser function ist eigentlich die trennung von layout und umsetztung, wenn man das so sagen kann, d.h. die *.h beschreibt die schnittstelle zu deiner *.c datei.
stell dir vor jemand will deine vorkompilierte library verwenden, und linkt die zu seiner software dazu, woher soll er (der compiler) dann wissen wie die datentypen bzw. functionsköpfe aussehen, na ganz einfach du gibst ihm die *.h da steht alles drin, nur eben nicht die konkrete umsetztung, denn die kommt ja über die library
hoffe das war halbwegs verständlich
lg lolo
-
Wenn du Headerdateien verstehen willst, dann muss du begreifen, dass #include nichts anderes macht, als die Datei an der Stelle einzufügen. Da gibt es keine Magie!
Das mit static stimmt. Funktionen sind standardmäßig extern und können aus anderen Modulen (Objektdateien) zugegriffen werden, außer man benutzt static. Anders würde ja sonst das Konzept mit #include nicht funktionieren.
Die C-File muss den eigenen Header nicht unbedingt includieren, außer da werden irgend welche Konstanten oä vorgegeben.
In den Header gehören keine Implementierungen, weil #include wie gesagt nur Text einfügt. Wenn man eine Implementierung im Header hätte, dann wäre die nun ja in allen Dateien vorhanden => mehrfach vorhanden. Wobei das so ganz auch nicht mehr stimmt, da man
inline
Funktionen in den Header schreiben kann.Hier ein paar Beispiele
// foo.h #ifndef FOO_H #define FOO_H void foo(); #endif // foo.c #include <stdio.h> void foo() { puts("foo"); } void bar() { puts("bar"); } static void baz() { puts("baz"); } // main.c #include "foo.h" void bar(); void baz(); int main() { foo(); bar(); // baz(); <-- das wird dir eine undefined reference geben, da baz in foo.c versteckt ist }
-
Danke schonmal fuer die Antworten. Soweit hatte ich mir das ja auch schon gedacht.
Nun Frage ich mich nur noch warum mein Prof meinte das alle Funktionen im Header-File definiert sein muessen, eben nicht nur solche welche nach aussen sichtbar sind/sein sollen.
Gruss,
fish
-
fish12345 schrieb:
Warum steht dann aber ueberall, dass nur oeffentliche Funktionen im Header-File bekannt gegeben werden?
Ist doch ok, was sollten denn die nicht öffentlichen da? Nur die Prototypen der exportieren Funktionen packt man sinnvollerweise in die Headerdatei.
fish12345 schrieb:
Ausserdem hat er gefragt, warum ein C-File eigentlich das eigene Header-File includen muss.
Muss nicht unbedingt. Muss man dann, wenn sich in der Headerdatei Strukturdeklarationen, Macros, Konstanten, Typendefinitionen etc. benutzt, die in der C Datei benutz werden.
fish12345 schrieb:
Ehrlich gesagt, faellt mir hierzu keine schluessige Antwort ein. Evtl. weil der Preprocessor die Definitionen aus dem Header-File nicht automatisch in das C-File uebernimmt und somit die Typen- und Markodefinitonen usw. nicht im C-File bekannt waeren?
Jepp.
fish12345 schrieb:
Dann stellte er noch die Frage warum in eine Header-Datei keine Implementierung gehoert. Ehrlich gesagt, weiss ich auch hierrauf keine sichere Antwort. Legt der Binder sich evtl. auf die Nase weil nun mehrere C-Dateien die gleiche Funktion beinhalten?
Man wäre weniger flexibel, der Sinn und Zweck einer Headerdatei als Schnittstelle zu den Übersetzungseinheiten wäre nicht mehr gegeben. Man hätte das Problem der Mehrfacheinbindung.
Gruß,
B.B.
-
fish12345 schrieb:
Nun Frage ich mich nur noch warum mein Prof meinte das alle Funktionen im Header-File definiert sein muessen, eben nicht nur solche welche nach aussen sichtbar sind/sein sollen.
Gruss,
fishAahh!! Jetzt weiß ich, was gemeint sein könnte!
Bsp.: Funktion B() ist nicht öffentlich.
Innerhalb der C Datei ruft Funktion A() funktion B() auf. Die Funktion B() steht unter der Funktion A() und ist somit für Funktion A() nicht sichtbar. Nagut, selbst dann würde ich den Prototypen von B() oben in der C Datei deklarieren und nicht in der Headerdatei.
-
Big Brother schrieb:
Nagut, selbst dann würde ich den Prototypen von B() oben in der C Datei deklarieren und nicht in der Headerdatei.
Meistens erreicht man durch geschickte Anordnung der Reihenfolge innerhalb der C Datei, das man sich auch diese Deklaration sparen kann:
void B() { // B ist nicht in der Headerdatei deklariert. //.. } void A() { //.. B(); //.. }
-
Big Brother schrieb:
fish12345 schrieb:
Nun Frage ich mich nur noch warum mein Prof meinte das alle Funktionen im Header-File definiert sein muessen, eben nicht nur solche welche nach aussen sichtbar sind/sein sollen.
Gruss,
fishAahh!! Jetzt weiß ich, was gemeint sein könnte!
Bsp.: Funktion B() ist nicht öffentlich.
Innerhalb der C Datei ruft Funktion A() funktion B() auf. Die Funktion B() steht unter der Funktion A() und ist somit für Funktion A() nicht sichtbar. Nagut, selbst dann würde ich den Prototypen von B() oben in der C Datei deklarieren und nicht in der Headerdatei.Ja aber das ist, warum der Prof. es da haben will! Habe auch einen (altbackenen), der das so haben will/wollte.
-
beselbube schrieb:
Ja aber das ist, warum der Prof. es da haben will! Habe auch einen (altbackenen), der das so haben will/wollte.
Der kann ja gern haben was will er denn. Es ist aber kein Muss.