Bei Funktionsprototypen ist das extern flüssiger als Wasser (OK,
schaden tut es nicht...). extern wird nur bei Variablen benötigt, weil
der Compiler da nicht von der Syntax her unterscheiden kann, ob es sich
um eine Definition (also Anlegen einer Variablen inklusive Reservierung
von Speicher) handelt oder um eine Deklaration ("Bekanntmachung", die
dem Compiler lediglich sagt, dass irgendwo anders eine Variable des
Namens und des Typs definiert ist). Ein Funktionsprototyp ist auch ohne
extern als solcher erkennbar, nämlich durch die Tatsache, dass auf die
schließende Klammer nach der Parameter-Liste ein Semikolon folgt.
Jede Variable und Funktion, die in einem Programm verwendet wird, muss
genau einmal definiert werden. Deklarieren kann man sie beliebig oft.
Deshalb gehören in eine .h-Datei auch prinzipiell nur Deklarationen
(also Variablen mit extern und Funktionsprototypen) und keine
Definitionen hinein, damit es bei mehrfach-includes nicht zu
Kollisionen kommt. Wenn eine Funktion in einer C-Datei definiert wird,
und sie in anderen C-Dateien zur Verfügung stehen soll, dann wird eine
.h-Datei angelegt, die die dazugehörigen Prototypen enthält. Die
.h-Datei wird in alle .c-Dateien, in denen die betreffenden Funktionen
verwendet werden sollen, mit #include eingebunden. Die .c-Datei wird dem
Compiler als Quelldatei angegeben und dann von diesem separat
compiliert.