Hi!
Ich versuch das mal als Übung zu sehen.
Ich habe mich in den letzten Wochen in C eingearbeitet und über eine Auflistung, was in einen Header gehört, bin ich zwar nicht gestoßen, meine aber dennoch den Sinn verstanden zu haben.
Um das zu überprüfen jetzt mal mein Post.
In eine Header-Datei kommt generell kein ausführbarer Code.
Stattdessen findet man darin Deklarationen und Präcompileranweisungen.
Das hat den Sinn, dass verschiedene C-Quellen auf eine Funktion zugreifen können, die nur eine der Quellen implementiert hat.
Du kannst also eine Funktion in der Quelle eins.c schreiben und ihre Deklaration in den Header eins.h schreiben. Deine Quelle zwei.c bindet den Header eins.h ebenfalls ein und kann dann die Funktion aus eins.c benutzen, ohne zu wissen, was sie macht. Nur was man ihr übergeben muss und was man zurück erhält (also die Typen) sind bekannt.
So kann man dann eins.c und zwei.c kompilieren.
Man muss aber beide Objektdateien (eins.o und zwei.o) zusammen linken, denn sonst bemerkt der Linker bei zwei.o "Oh, ich soll hier irgendwo eine Funktion finden, aber ich seh keine" und bricht ab.
Ausführbarer Code hingegen gehört immer in die Quelldateien, denn wenn man z.B. eine Variable im Header eins.h deklariert, wird es beim Linken zu einem Fehler kommen, weil die Headerdatei zweimal eingebunden wird und die Variable daher doppelt existiert. Das gleiche gilt für die Implementation von Funktionen.
Die Headerdateien dienen also als Interface während die C-Quellen die Implementation darstellen.
Man kann zwar per #include auch C-Quellen einbinden, aber eigentlich sollte man nur Header-Dateien einbinden.
Die C-Quellen kommen beim Linken zusammen.
Beispiel:
eins.h:
Code:
#include <stdio.h>
#include <string.h>
void eineFunktion(int i);
eins.c:
Code:
#include "eins.h"
void eineFunktion(int i)
{
printf("%s\n",i+1);
}
zwei.c:
Code:
#include "eins.h"
int main(int argc, char** argv)
{
eineFunktion(3);
return 0;
}
Ich bin mir ziemlich sicher, dass Header-Dateien für 1000 weitere Dinge gut sind (Typdefinitionen so'n Zeug und sicherlich noch Sachen, von denen ich noch nie gehört habe), aber ich meine, damit den Grundgedanken von Header-Dateien getroffen zu haben.
Falls dem nicht so ist, korrigiert mich bitte.
