static (auf Datei-/Modul-Ebene):
static deklariert sind, ist der Geltungsbereich auf das kompilierte Modul (Datei) beschränkt.extern:
Wichtig: static — zur Verbergung der Implementierung, extern — zur Verknüpfung zwischen Modulen.
Beispiel:
main.c:
static int hidden_var = 5; extern int shared_var; int main() { printf("shared %d", shared_var); }
shared.c:
int shared_var = 10;
Der Versuch, hidden_var aus einer anderen Datei zu verwenden, führt zu einem Linkerfehler.
Was passiert, wenn eine Variable mit demselben Namen und unterschiedlichen Specifiers static/extern in verschiedenen Modulen definiert wird?
Antwort: Jede static-Variable (zum Beispiel static int foo; in verschiedenen Dateien) ist ein völlig unabhängiges Objekt. Die Deklaration extern int foo; sucht nach einer geteilten globalen Variable mit dem Namen foo. static und extern dürfen nicht vermischt werden — dies führt zu einem Linkerfehler, wenn foo in einer Datei als static definiert und in einer anderen als extern deklariert wird.
Geschichte Im Projekt wurde die Duplizierung gleichnamiger Funktionen (ohne static) in verschiedenen Modulen entdeckt: der Linker verknüpfte nur eine von ihnen, die andere "ging verloren", was die Logik der Anwendung beeinflusste.
Geschichte In einem großen Projekt wurde die globale Variable
int counter;in zwei Modulen deklariert, jedes Mal ohne extern. Infolgedessen hing das Verhalten der Anwendung von der Linkreihenfolge ab, manchmal traten Konfliktsymbole auf.
Geschichte Ein Modul verwendete eine Funktion mit fehlerhaftem Geltungsbereich: Sie war als static definiert, und der Entwickler versuchte, sie aus einem anderen Quellcode aufzurufen — das Programm ließ sich nicht kompilieren, ohne den Modifikator auf extern zu ändern (oder ohne static zu entfernen).