Forum: Compiler & IDEs Präprozessor und Header


von Knut (Gast)


Lesenswert?

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?






von Matthias (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.