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