INTRODUZIONE ALLA PROGRAMMAZIONE IN C



Scopo delle variabili esterne



Una variabile esterna (o funzione) non e' sempre completamente globale. Il C applica la seguente regola: l'estensione di una variabile (o di una funzione) esterna comincia dal suo punto di dichiarazione e termina alla fine del file (modulo) in cui viene dichiarata. Consideriamo il seguente esempio: main() {...} int what_scope; float end_of_scope[10]; void what_global() {...} char alone; float fn() {...} main non puo' vedere what_scope o end_of_scope, mentre le funzioni what_global ed fn possono vederle. Solo la funzione fn puo' vedere la variabile alone. Questa e' anche la prima delle ragioni per cui dobbiamo creare prototipi di funzioni prima che nel codice venga dichiarato il corpo della funzione. In questo caso main non riconoscera' le funzioni what_global ed fn; a sua volta what_global non riconosce fn, ma fn riconosce invece what_global, poiche' e' stata dichiarata al di sopra di essa. Facciamo presente che l'altra ragione per cui creiamo prototipi di funzioni e' che possono essere fatti alcuni controlli sui parametri passati alle funzioni. Se abbiamo bisogno di riferirci ad una variabile esterna prima della sua dichiarazione oppure nel caso in cui sia definita in un altro modulo, dobbiamo dichiararla come una variabile esterna, cioe': extern int what_global; In questo modo ritorniamo all'esempio modulare. Abbiamo una stringa global AnotherString dichiarata in main.c e condivisa con WriteMyString.c, dove e' dichiarata come variabile esterna. Attenzione: il prefisso "extern" e' una dichiarazione e non una definizione, cioe' nessun blocco di memoria viene riservato per una variabile esterna (si tratta solamente della dichiarazione della proprieta' della variabile). La variabile vera e propria deve essere definita una sola volta all'interno dell'intero programma, mentre e' possibile avere tutte le dichiarazioni esterne che sono necessarie. Le dimensioni degli array devono ovviamente essere date con le definizioni, ma non sono richieste con le dichiarazioni esterne. Ad esempio: main.c: int arr[100]; file.c: extern int arr[];