Barninga Z
a- a+

Le variabili C external

L'ACCESSIBILITÀ' E LA DURATA DELLE VARIABILI

Le variabili external 

Sono variabili external tutte quelle dichiarate al di fuori delle funzioni. Esse hanno durata estesa a tutto il tempo di esecuzione del programma, ed in ciò appaiono analoghe alle variabili static, ma differiscono da queste ultime in quanto la loro accessibilità è globale a tutto il codice del programma. In altre parole, è possibile leggere o modificare il contenuto di una variabile external in qualsiasi funzione. Vediamo, come sempre, un esempio: 

#include

int 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 fuori di qualunque funzione, è accessibile sia in main() che in incrementa() e il suo valore è conservato per tutta la durata dell'esecuzione. 

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

#include

int 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 codice interno a main() nasconde la x globale, dichiarata fuori dalla funzione; tuttavia la variabile locale cessa di esistere alla fine del blocco, pertanto quella globale è nuovamente accessibile. 

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

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

#include

int 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 variabili external vengano dichiarate all'interno delle funzioni, ma in questo caso è necessario che tali variabili siano state dichiarate al di fuori della funzione e in linee di codice precedenti quelle della funzione stessa, come negli esempi precedenti. Se tali condizioni non sono rispettate il compilatore segnala un errore di simbolo non definito: 

 

#include

int x = 123;

void main(void)
{
    printf("%d
" ,x,y);   // errore! y non e' stata ancora dichiarata
}

int y = 321;

Il codice dell'esempio è compilato correttamente se si dichiara extern la y in main()

#include

int 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 le variabili globali in testa al sorgente, ma se una variabile external e una funzione che la referenzia sono definite  in due file sorgenti diversi[27], è necessario comunque dichiarare la variabile nella funzione. 

E' opportuno limitare al massimo l'uso delle funzioni external: il loro utilizzo indiscriminato, infatti, può generare risultati catastrofici. In un programma qualsiasi è infatti piuttosto facile perdere traccia del significato delle variabili, soprattutto quando esse siano numerose. Inoltre le variabili globali sono generate al momento della compilazione ed esistono durante tutta l'esecuzione, incrementando così lo spazio occupato dal file eseguibile e la quantità memoria utilizzata dallo stesso. Infine, con esse non è possibile utilizzare nomi localmente significativi (cioè significativi per la funzione nella quale vengono di volta in volta utilizzate) e si perde la possibilità di mantenere ogni funzione una entità a se stante, indipendente da tutte le altre. 

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

#include

static int x = 123;

void main(void)
{
    printf("%d
" ,x);
}

 

Dichiarando static una variabile globale se ne limita 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 in grado di accedere alla x neppure qualora essa venga dichiarata con extern al loro interno. Naturalmente è ancora possibile dichiarare extern la variabile nelle funzioni definite nel medesimo file: 

#include

static int x = 123;

void main(void)
{
    extern int x;

    printf("%d
" ,x);
}

 

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

 



Ti potrebbe interessare anche

commenta la notizia

C'è 1 commento
Lorenzo
Hai qualche domanda da fare?