Vielleicht nochmal ein kurzes Beispiel...

das ist eine Funktionsdefinition, die irgendwo in einer .c Datei stehen kann:
Code:
int Addiere(int a, int b)
{
	return a + b;
}
Aufrufen kann man diese Funktion dann z.B. so:
Code:
int Ergebnis = Addiere(3, 5);
Aber das geht nur in der gleichen .c Datei, und auch erst nach der Funktionsdefinition, da diese Funktion dem Compiler vorher einfach nicht bekannt ist.

Abhilfe schafft eine Funktionsdeklaration (auch "Prototyp" genannt):
Code:
int Addiere(int a, int b);
Wie du siehst enthält diese Deklaration selbst keinen Code, sondern dient nur als Hinweis nachdem Motto "pass auf, da gibt es eine Funktion mit dem Namen Addiere die zwei int Parameter hat, und einen int als Rückgabewert liefert". Setzt man diese Deklaration ganz an den Anfang der .c Datei, ist die Funktion Addiere in der gesamten Datei verfügbar (auch schon vor deren Definition).

Möchte man in einer anderen .c Datei auf diese Funktion zugreifen reicht das aber noch nicht, in diesem Fall schreibt man den Prototyp nicht in die .c Datei, sondern in eine .h Datei die per #include in allen .c Dateien eingebunden wird, welche Zugriff auf die Funktion Addiere benötigen.


Dabei sollte man wissen, daß z.B. ein #include "abcdef.h" vom Präprozessor einfach durch den kompletten Text von abcdef.h ersetzt wird (bevor der Compiler die Datei verarbeitet). Das ganze ist also nichts weiter als ein automatisches Einfügen der Funktionsdeklarationen (und was sonst noch so in den .h Dateien steht), in allen .c Dateien die sie benötigen.