Das extern-Schlüsselwort in C

Jinku Hu 12 Oktober 2023
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);
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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