Barninga Z
a- a+

Le variabili C external

L'ACCESSIBILITÀ' E LA DURATA DELLEVARIABILI

Le variabili external 

Sono variabili external tutte quelle dichiarate al difuori delle funzioni. Esse hanno durata estesa a tutto iltempo di esecuzione del programma, ed in ciò appaionoanaloghe alle variabili static, ma differiscono daqueste ultime in quanto la loro accessibilità èglobale a tutto il codice del programma. In altre parole,è possibile leggere o modificare il contenuto di unavariabile external in qualsiasi funzione. Vediamo, comesempre, un esempio: 

#includeint x = 123;void incrementa(void){    ++x;    printf("%d" ,x);}void main(void){    printf("%d" ,x);    incrementa();    printf("%d" ,x);}

 

L'output del programma è il seguente: 

123
124
124

 

Infatti la variabile x, essendo definita al di fuoridi qualunque funzione, è accessibile sia inmain() che in incrementa() e il suo valoreè conservato per tutta la duratadell'esecuzione. 

Se una variabile external (o globale) ha nome identico aquello di una variabile automatic (o locale),quest'ultima "nasconde" la prima. Il codice chesegue: 

#includeint x = 123;void main(void){    printf("%d" ,x);    {  int x = 321;  printf("%d" ,x);    }    printf("%d" ,x);}

 

produce il seguente output: 

123
321
123

 

Infatti la x locale dichiarata nel blocco di codiceinterno a main() nasconde la x globale,dichiarata fuori dalla funzione; tuttavia la variabile localecessa di esistere alla fine del blocco, pertanto quellaglobale è nuovamente accessibile. 

Anche le variabili external, come quelle static,sono inizializzate dal compilatore al momento dellacompilazione, ed è loro attribuito valore 0se il programmatore non indica un valore inizialecontestualmente alla dichiarazione. 

Come abbiamo visto, le variabili external devono esseredichiarate al di fuori delle funzioni, senza necessitàdi specificare alcuna particolare parola chiave. Tuttavia,esse possono (ma non è obbligatorio) essere dichiarateanche all'interno delle funzioni che le referenziano,questa volta necessariamente precedute dalla parola chiaveextern

#includeint x = 123;void main(void){    extern int x;  // riga facoltativa; se c'e' non puo' reinizializzare x    printf("%d" ,x);}

 

In effetti il compilatore non richiede che le variabiliexternal vengano dichiarate all'interno delle funzioni,ma in questo caso è necessario che tali variabilisiano state dichiarate al di fuori della funzione e in lineedi codice precedenti quelle della funzione stessa, come negliesempi precedenti. Se tali condizioni non sono rispettate ilcompilatore segnala un errore di simbolo non definito: 

 

#includeint x = 123;void main(void){    printf("%d" ,x,y);   // errore! y non e' stata ancora dichiarata}int y = 321;

Il codice dell'esempio è compilato correttamentese si dichiara extern la y inmain()

#includeint x = 123;void main(void){    extern int x;  // facoltativa    extern int y;  // obbligatoria!    printf("%d" ,x,y);}int y = 321;

 

Il problema può essere evitato dichiarando tutte levariabili globali in testa al sorgente, ma se una variabileexternal e una funzione che la referenzia sono definite in due file sorgenti diversi[27], è necessariocomunque dichiarare la variabile nella funzione. 

E' opportuno limitare al massimo l'uso dellefunzioni external: il loro utilizzo indiscriminato, infatti,può generare risultati catastrofici. In un programmaqualsiasi è infatti piuttosto facile perdere tracciadel significato delle variabili, soprattutto quando essesiano numerose. Inoltre le variabili globali sono generate almomento della compilazione ed esistono durante tuttal'esecuzione, incrementando così lo spaziooccupato dal file eseguibile e la quantità memoriautilizzata dallo stesso. Infine, con esse non èpossibile utilizzare nomi localmente significativi(cioè significativi per la funzione nella qualevengono di volta in volta utilizzate) e si perde lapossibilità di mantenere ogni funzione unaentità a se stante, indipendente da tutte lealtre. 

Va infine osservato che una variabile external puòessere anche static

#includestatic int x = 123;void main(void){    printf("%d" ,x);}

 

Dichiarando static una variabile globale se nelimita la visibilità al solo file in cui essa èdichiarata: nel caso di un codice suddiviso in piùsorgenti, le funzioni definite in altri file non saranno ingrado di accedere alla x neppure qualora essa vengadichiarata con extern al loro interno. Naturalmenteè ancora possibile dichiarare extern lavariabile nelle funzioni definite nel medesimo file: 

#includestatic int x = 123;void main(void){    extern int x;    printf("%d" ,x);}

 

Come facilmente desumibile dall'esempio, la parola chiavestatic non deve essere ripetuta. 

 



Ti potrebbe interessare anche

commenta la notizia