La parola chiave esterna in C

Jinku Hu 12 ottobre 2023
La parola chiave esterna in C

Questo articolo mostrerà diversi metodi su come utilizzare la parola chiave extern in C.

Usa la parola chiave extern per dichiarare una variabile definita in altri file in C

In genere, le variabili del linguaggio C hanno 3 diversi tipi di collegamento: collegamento esterno, collegamento interno o nessun collegamento. Se una variabile è definita in un blocco o nell’ambito di una funzione, si ritiene che non abbia alcun collegamento. Una variabile che ha l’ambito del file può avere un collegamento interno o esterno. Vale a dire, se una variabile globale è dichiarata con il qualificatore static, ha il collegamento interno, il che implica che la variabile può essere utilizzata in un unico file sorgente (unità di traduzione per essere più precisi). Una variabile globale senza un qualificatore static è considerata avere un collegamento esterno e può essere utilizzata in diversi file sorgente. Per usare la variabile globale definita in qualche altro file sorgente, dovrebbe essere dichiarata usando la parola chiave extern.

#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);
}

Produzione:

counter: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Le variabili qualificate extern sono solitamente definite da qualche parte in file diversi. Tuttavia, tecnicamente si possono dichiarare variabili globali nello stesso file con la parola chiave extern, come mostrato nell’esempio seguente. Questo tipo di dichiarazione è essenzialmente ridondante perché il compilatore rende automaticamente visibili i nomi delle variabili ovunque nello stesso ambito di file.

#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);
}

Attenzione però, le variabili dichiarate extern non dovrebbero essere inizializzate poiché porta ad avvertimenti del compilatore se definiamo la variabile globale const char* in un file sorgente e la inizializziamo con un valore letterale di stringa. Dichiarare la stessa variabile senza qualificatore const nel diverso file sorgente verrà compilata senza avvertimenti e rimuoverà la costanza dell’oggetto. Quindi, se l’utente cerca di modificare la stringa di sola lettura tmp, il compilatore non genererà un errore, ma il programma colpirà l’errore di segmentazione.

#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);
}
Autore: 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