Das extern-Schlüsselwort in C
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);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook