Come abbiamo detto in un precedente articolo, quando si vuole articolare un programma su più file sorgenti è indispensabile coordinare le dichiarazioni delle variabili per evitare errori di interpretazione da parte del compilatore e del linker.
Per questo il C++ rende possibile al programmatore di definire per le variabili, diverse classi di memorizzazione, che hanno significato diverso a seconda che le variabili siano definite all’esterno delle funzioni o all’interno di esse.
La Dichiarazione delle Variabili a Livello Esterno
Durante lo sviluppo di un programma articolato su più file, il responsabile di un modulo può trovarsi, nel definire una variabile globale, di fronte a tre casi:
- la variabile ha significato, e quindi deve essere visibile, solo al’interno delle funzioni che appartengono a quel modulo e quindi si vuole evitare che venga in conflitto con altre variabili con lo stesso nome, definite su altri file sorgenti.
La variabile deve quindi essere dichiarata all’inizio del file sorgente e deve essere fatta precedere dallo specificatore static, per renderla visibile solo nel file in cui è stata dichiarata.
Se nella definizione della variabile non viene specificato il valore iniziale, questo viene posto automaticamente a zero.
Nella situazione che segue, per esempio,
file 1
static int x=5;
main()
{corpo del main
}
file 2
static int x=2;
void int Funz1()
{corpo di Funz1
}
void Funz2()
{corpo di Funz2
}
Le due variabili x, pur essendo entrambe globali, vengono considerate come due entità distinte a ciascuna delle quali si può accedere all’interno del file in cui è stata dichiarata: alla prima si può accedere solo dall’interno della funzione main(), mentre la seconda è visibile dalle due funzioni Funz1 e Funz2, ma non dal main().
- La variabile ha significato globale e dovrà essere utilizzata anche in altri moduli: viene dichiarata nel modo solito.
Per esempio, nella situazione seguente:
file1
int x=5;
main()
{corpo del main
}
Alla variabile globale x si può accedere solo dalla funzione main() del file sorgente specificato, ma anche da tutte le funzioni che compongono gli altri moduli del programma.
- La variabile è stata definita in un altro modulo, ma le nostre funzioni devono accedervi per leggere il valore ed eventualmente modificarlo: viene dichiarata come variabile globale facendola precedere dallo specificatore extern.
In questo esempio:
file2
extern int x;
Funz1()
{corpo di Funz1
}
Dall’interno della funzione Funz1 si può accedere alla variabile x che si presuppone definita in un altro file sorgente.
Comunque, per far si che il linker possa risolvere eventuali conflitti è indispensabile che la definizione (e non la dichiarazione) della variabile compaia in un solo dei moduli che compongono il programma.
Nel prossimo articolo tratteremo la dichiarazione delle variabili a livello interno.