Sie müssen zwischen zwei getrennten Konzepten unterscheiden: Funktionsdefinition und Symboldeklaration. "extern" ist ein Verknüpfungsmodifikator, ein Hinweis an den Compiler, wo das Symbol definiert ist, auf das später Bezug genommen wird (der Hinweis lautet "nicht hier").
Wenn ich schreibe
extern int i;
Im Dateibereich (außerhalb eines Funktionsblocks) in einer C-Datei sagen Sie dann "Die Variable kann an anderer Stelle definiert werden".
extern int f() {return 0;}
ist sowohl eine Deklaration der Funktion f als auch eine Definition der Funktion f. Die Definition überschreibt in diesem Fall das Externe.
extern int f();
int f() {return 0;}
ist zunächst eine Erklärung, gefolgt von der Definition.
Die Verwendung von extern
ist falsch, wenn Sie eine Dateibereichsvariable deklarieren und gleichzeitig definieren möchten. Beispielsweise,
extern int i = 4;
gibt je nach Compiler einen Fehler oder eine Warnung aus.
Die Verwendung von extern
ist nützlich, wenn Sie die Definition einer Variablen explizit vermeiden möchten.
Lassen Sie mich erklären:
Angenommen, die Datei ac enthält:
#include "a.h"
int i = 2;
int f() { i++; return i;}
Die Datei ah enthält:
extern int i;
int f(void);
und die Datei bc enthält:
#include <stdio.h>
#include "a.h"
int main(void){
printf("%d\n", f());
return 0;
}
Das externe Element im Header ist nützlich, da es dem Compiler während der Verbindungsphase mitteilt, dass dies eine Deklaration und keine Definition ist. Wenn ich die Zeile in ac entferne, die i definiert, ihm Speicherplatz zuweist und ihm einen Wert zuweist, sollte das Programm nicht mit einer undefinierten Referenz kompiliert werden können. Dies teilt dem Entwickler mit, dass er auf eine Variable verwiesen, diese aber noch nicht definiert hat. Wenn ich andererseits das Schlüsselwort "extern" weglasse und die int i = 2
Zeile entferne , wird das Programm immer noch kompiliert - ich werde mit einem Standardwert von 0 definiert.
Dateibereichsvariablen werden implizit mit einem Standardwert von 0 oder NULL definiert, wenn Sie ihnen keinen expliziten Wert zuweisen - im Gegensatz zu Blockbereichsvariablen, die Sie oben in einer Funktion deklarieren. Das Schlüsselwort extern vermeidet diese implizite Definition und hilft so, Fehler zu vermeiden.
Für Funktionen in Funktionsdeklarationen ist das Schlüsselwort tatsächlich redundant. Funktionsdeklarationen haben keine implizite Definition.