HOWTO · C
Das extern-Schlüsselwort in C
Dieser Artikel beschreibt die Verwendung des Schlüsselworts extern in C
Auf dieser Seite
In diesem Artikel werden mehrere Methoden zur Verwendung des Schlüsselworts extern in C vorgestellt.
Verwenden Sie das Schlüsselwort extern, um eine in anderen Dateien definierte Variable in C zu deklarieren
Im Allgemeinen haben die Variablen der Sprache C 3 verschiedene Verknüpfungstypen: externe Verknüpfung, interne Verknüpfung oder keine Verknüpfung. Wenn eine Variable in einem Block- oder Funktionsbereich definiert ist, gilt sie als nicht verknüpft. Eine Variable, die den Dateibereich hat, kann interne oder externe Verknüpfung haben. Wenn nämlich eine globale Variable mit dem Qualifier static deklariert wird, hat sie die interne Verknüpfung, was bedeutet, dass die Variable in einer einzigen Quelldatei (genauer gesagt: Übersetzungseinheit) verwendet werden kann. Eine globale Variable ohne den Qualifizierer static gilt als extern verknüpft und kann in verschiedenen Quelldateien verwendet werden. Um die globale Variable, die in einer anderen Quelldatei definiert ist, zu verwenden, sollte sie mit dem Schlüsselwort extern deklariert werden.
#include <stdio.h>
#include <stdlib.h>
#ifndef COUNT
#define COUNT 10
#endif
extern int counter;
int main(void) {
printf("counter: ");
for (int i = 0; i < COUNT; ++i) {
counter += 1;
printf("%d, ", counter);
}
printf("\b\b \n");
exit(EXIT_SUCCESS);
}
Ausgabe:
counter: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
extern qualifizierte Variablen werden normalerweise irgendwo in verschiedenen Dateien definiert. Dennoch kann man technisch gesehen globale Variablen in der gleichen Datei mit dem Schlüsselwort extern deklarieren, wie im folgenden Beispiel gezeigt. Diese Art der Deklaration ist im Grunde überflüssig, da der Compiler die Variablennamen automatisch überall im gleichen Dateibereich sichtbar macht.
#include <stdio.h>
#include <stdlib.h>
#ifndef COUNT
#define COUNT 10
#endif
int counter2 = 0;
int main(void) {
extern int counter2; // redundant
counter2 += 10;
printf("%d\n", counter2);
exit(EXIT_SUCCESS);
}
Beachten Sie jedoch, dass extern deklarierte Variablen nicht initialisiert werden sollten, da es zu Compiler-Warnungen führt, wenn wir in einer Quelldatei eine globale Variable const char* definieren und diese mit einem String-Literalwert initialisieren. Das Deklarieren der gleichen Variable ohne den const-Qualifier in einer anderen Quelldatei wird ohne Warnungen kompiliert, und es wird die Konstante des Objekts entfernt. Wenn der Benutzer also versucht, die schreibgeschützte Zeichenkette tmp zu ändern, wird der Compiler keinen Fehler ausgeben, aber das Programm wird auf einen Segmentierungsfehler stoßen.
#include <stdio.h>
#include <stdlib.h>
#ifndef COUNT
#define COUNT 10
#endif
extern int counter;
// extern int counter = 3; // erroreous
extern char *tmp; // erroreous
int counter2 = 0;
int main(void) {
printf("counter: ");
for (int i = 0; i < COUNT; ++i) {
counter += 1;
printf("%d, ", counter);
}
printf("\b\b \n");
tmp[0] = 'S'; // segmentation fault
printf("%s", tmp);
exit(EXIT_SUCCESS);
}