Viele Jahre später entdecke ich diese Frage. Nachdem ich jede Antwort und jeden Kommentar gelesen hatte, dachte ich, ich könnte ein paar Details klären ... Dies könnte für Leute nützlich sein, die über die Google-Suche hierher kommen.
Die Frage bezieht sich speziell auf die Verwendung von "extern" -Funktionen, daher werde ich die Verwendung von "extern" mit globalen Variablen ignorieren.
Definieren wir 3 Funktionsprototypen:
//--------------------------------------
//Filename: "my_project.H"
extern int function_1(void);
static int function_2(void);
int function_3(void);
Die Header-Datei kann vom Hauptquellcode wie folgt verwendet werden:
//--------------------------------------
//Filename: "my_project.C"
#include "my_project.H"
void main(void){
int v1 = function_1();
int v2 = function_2();
int v3 = function_3();
}
int function_2(void) return 1234;
Um zu kompilieren und zu verknüpfen, müssen wir "function_2" in derselben Quellcodedatei definieren, in der wir diese Funktion aufrufen. Die beiden anderen Funktionen können in unterschiedlichem Quellcode " .C" definiert sein oder sich in einer beliebigen Binärdatei ( .OBJ, * .LIB, * .DLL) befinden, für die wir möglicherweise nicht den Quellcode haben.
Fügen wir den Header "my_project.H" erneut in eine andere "* .C" -Datei ein, um den Unterschied besser zu verstehen. Im selben Projekt fügen wir die folgende Datei hinzu:
//--------------------------------------
//Filename: "my_big_project_splitted.C"
#include "my_project.H"
void old_main_test(void){
int v1 = function_1();
int v2 = function_2();
int v3 = function_3();
}
int function_2(void) return 5678;
int function_1(void) return 12;
int function_3(void) return 34;
Wichtige Merkmale zu beachten:
Wenn eine Funktion in einer Header-Datei als "statisch" definiert ist, muss der Compiler / Linker in jedem Modul, das diese Include-Datei verwendet, eine Instanz einer Funktion mit diesem Namen finden.
Eine Funktion, die Teil der C-Bibliothek ist, kann in nur einem Modul ersetzt werden, indem ein Prototyp nur in diesem Modul mit "statisch" neu definiert wird. Ersetzen Sie beispielsweise einen Aufruf von "malloc" und "free", um die Funktion zur Erkennung von Speicherverlusten hinzuzufügen.
Der Bezeichner "extern" wird für Funktionen nicht wirklich benötigt. Wenn "statisch" nicht gefunden wird, wird eine Funktion immer als "extern" angenommen.
"Extern" ist jedoch nicht die Standardeinstellung für Variablen. Normalerweise muss jede Header-Datei, die Variablen definiert, die in vielen Modulen sichtbar sein sollen, "extern" verwenden. Die einzige Ausnahme wäre, wenn garantiert wird, dass eine Header-Datei von einem und nur einem Modul enthalten ist.
Viele Projektmanager würden dann verlangen, dass eine solche Variable am Anfang des Moduls platziert wird und nicht in einer Header-Datei. Einige große Projekte, wie der Videospielemulator "Mame", erfordern sogar, dass eine solche Variable nur über der ersten Funktion angezeigt wird, die sie verwendet.