Hj auf der Seite http://de.wikibooks.org/wiki/C-Programmierung:_Eigene_Header versuche ich die Notwendigkeit von Headerdateien zu verstehen. Warum braucht man Headerdateien? Kann ich nicht den Inhalt der Header einfach in meine main.c schreiben? Dient das nur der Übersichtlichkeit? In dem Link ist ja ein schönes Beispiel. Ich verstehe nicht warum in der Headerdatei nochmal das #ifndef MYHEADER_H auftritt. Denn der Fall des Nichtvorhandenseins der myheader.h kann ja garnicht eintreffen, da in der .c Datei die myheader.h auf jeden Fall aufgerufen wird. Das einzige was ich mir vorstellen könnte ist dieser Ablauf: 1. Programmstart: myheader.c Datei aufrufen 2. Erste Anweisung: myheader.h öffnen 3. #ifndef MYHEADER_H ausführen -> im "Rechner-Gehirn" ist das Wort "MYHEADER_H" noch nicht bekannt, also die IF Bedingung auswerten (PI usw. definieren) 4. bei Ende der myheader.h weitermachen in myheader.c 5. Falls irgendwo (in irgendeiner .c Datei) nochmal "include myheader.h" auftritt, würde die IF Anweisung in der myheader.h NICHT ausgewertet (Doppelinitialisierungen vermeiden) da sie im "Rechner-Gehirn" schon definiert wurde. Ist es das?
Wenn man nur eine .c datei hat, braucht man nicht umbedingt einen Header, das dient nur zur Übersichtlichkeit. Wenn man in einer C Datei mehrere funktionen definiert, und diese mehreren anderen C Dateien bekannt machen will, müssen die funktionsdeklarationen dann in den Header. Alle anderen C Dateien die diese benutzen wollen können dann die Header Datei einbinden. Das #ifndef brauchts wie du schon denkst zum vermeiden von doppelter Einbindung. Das muss nciht umbedingt so sein, dass die in einer .c Datei doppelt eingebunden werden. Es kann auch sein, dass eine C Datei (nennen wir sie main.c) zwei verschiedene Header einbindet, z.B. a.h und b.h, die beide verschiedene funktionen bereitstellen. b.h verwendet aber bereits funktionen, die in a.h bereitgestellt sind und bindet diese ein. Damit ist die Datei a.h in main.c doppelt inkludiert, und das führt zu Fehlermeldungen. Damit das nicht passiert macht man einfach diese #ifndef Anweisungen um alle Header.
Schau dir mal folgendes an. Vielleicht verstehst du dann das 'Warum' besser. http://www.mikrocontroller.net/articles/Funktionen_auslagern_%28C%29
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.