Newsgroup: it.comp.lang.c
Titolo: Scope

Salve a tutti.
Volevo sapere una delle sacri basi del C. Lo scope. Come funziona?
Cordiali saluti.
Matteo.

...

Scope (visibilita`) e Lifetime (validita`) sono nozioni fondamentali per
tutti (o quasi) i linguaggi.
La visibilita`, per variabili e routine ad esempio, riguarda la possibilita`
di referenziare (citare correttamente), all'interno del codice sorgente, un
simbolo (es. una variabile o una routine).
Es. lo 'scope' di una variabile (in C), normalmente, e` il blocco di codice
in cui e` dichiarata ovvero il modulo sorgente in testa al quale e`
dichiarata.
Per una routine, la porzione del codice, nel modulo in cui e` dichiarata la
stessa, al di sotto della sua implementazione.
Esistono clausole per modificare lo scope 'di default':
- extern, per aumentare lo scope di default
- static, per diminuire lo scope di default
- dichiarazione di prototipi (per le routine)

Volevo sapere una delle sacri basi del C. Lo scope. Come funziona?
Il termine "scope" è meglio inteso come "visibilità" ed è sempre
accompagnato dal "lifetime" (talvolta chiamato "extent").
Prima è meglio chiarire cosa sia il "lifetime".
Il "lifetime" è il periodo di vita di variabili e funzioni, durante l'
esecuzione di un programma e può essere globale o locale.
Un oggetto con lifetime globale (un oggetto globale) ha "storage"
(cioè spazio di memorizzazione) e valore definiti per tutta la durata
del programma, mentre un oggetto con lifetime locale (un oggetto
locale) ha "storage" e valore definiti solo all'interno del blocco in
cui esso è definito o dichiarato.
Ogni volta che si entra nel suo blocco, l'oggetto con lifetime locale
subisce una reinizializzazione del proprio spazio di memorizzazione e
lo perde quando vi si esce.
Le regole che stabiliscono se una variabile abbia lifetime globale o
locale sono le seguenti :
- variabili dichiarate a livello esterno (cioe' al di fuori di tutti i
blocchi del programma) hanno sempre lifetime globali.
- variabili dichiarate a livello interno (cioè dentro un blocco)
solitamente hanno lifetime locale. In ogni caso, si può fare in modo
che anche variabili di questo tipo abbiano lifetime globale includendo
la parola "static" come specificatore di classe di memorizzazione
nella loro dichiarazione. Una volta dichiarata "static", la variabile
conserverà il proprio valore allo stesso modo di una variabile
globale. Tuttavia sarà "visibile" SOLO all'interno del proprio blocco
e dei blocchi nidificati in esso.
La "visibilità" di un oggetto, invece, determina le porzioni del
programma in cui è legittimo riferirsi ad esso tramite il suo
identificatore. 
Un oggetto è visibile solo in quelle porzioni del codice contemplate
dal suo "scope", che può essere locale al file, alla funzione, al
blocco o al semplice prototipo di funzione in cui compare.
In C solo il nome delle etichette è destinato ad avere sempre uno
scope a livello di funzione. Negli altri casi lo scope è determinato
in base al livello in cui compare nel codice la dichiarazione
dell'oggetto.
Un oggetto dichiarato a livello esterno ha uno scope a livello di file
ed è pertanto visibile ovunque all'interno del file. 
Se la dichiarazione, invece, appare in un blocco (inclusa la lista dei
parametri formali nella definizione di funzioni) lo scope è limitato
al blocco in questione e a tutti i blocchi nidificati in esso.
I parametri formali dichiarati nella lista dei parametri di un
prototipo di funzione hanno scope limitato alla fascia che va dal
punto in cui la funzione viene dichiarata sino alla fine del
dichiaratore della funzione.
Le seguenti regole stabiliscono la visibilità delle variabili in un
programma :
- variabili dichiarate o definite a livello esterno sono visibili dal
punto della loro definizione (o dichiarazione) sino alla fine del file
sorgente. Si può tuttavia fare in modo, tramite appropriate
dichiarazioni, che esse siano visibili anche in altri file sorgenti
(per esempio utilizzando la keyword "extern"). 
Invece, variabili dichiarate a livello esterno con la parola chiave
"static" sono visibili solo all'interno del file sorgente in cui sono
definite.
- In generale, variabili dichiarate o definite a livello interno sono
visibili solo dal loro punto di dichiarazione o definizione sino alla
fine del blocco che contiene la dichiarazione o la definizione.
- Le variabili di tutti i blocchi più esterni sono visibili in tutti
quelli più interni. In ogni caso, la visibilità delle variabili si
nidifica anch'essa. Per esempio, un blocco può contenere dichiarazioni
di variabili, i cui identificatori sono gli stessi di quelli usati nei
blocchi in esso nidificati.
In tal caso i blocchi nidificati faranno riferimento all'ultima
ridefinizione della variabile e la definizione originaria (del blocco
più esterno) verrà ripristinata all'uscita dal blocco più interno.
- Le funzioni dichiarate "statiche" sono visibili solo all'interno del
file sorgente che le contiene. Tutte le altre funzioni sono per
default visibili in modo globale (un oggetto si dice "visibile in modo
globale" se con appropriate dichiarazioni lo si rende visibile in
tutti i moduli che compongono il programma). 
--
Andrea Laforgia        (
andrea_...@bigfoot.com
)