In C, le variabili possono avere vari ambiti: locale (all'interno di un blocco), globale (in tutto il file) e ambito di file (static). Una corretta gestione degli ambiti è importante per la prevedibilità del funzionamento e per prevenire conflitti di nomi.
Sono visibili in tutte le funzioni del file e, se dichiarate con extern, in tutto il progetto.
Vengono create all'ingresso nel blocco (ad esempio, funzione o ciclo). Non sono visibili al di fuori del blocco di dichiarazione.
static int foo; — solo per il file corrente.
Esempio:
static int counter = 0; // Solo all'interno del file void increment() { int temp = 10; // variabile locale ++counter; }
Se una variabile globale e una locale hanno lo stesso nome, quale delle due viene utilizzata all'interno della funzione e perché?
Risposta: Viene utilizzata la locale, poiché essa "oscurisce" (shadowing) il nome globale all'interno del proprio ambito. La variabile globale rimane accessibile al di fuori del blocco di dichiarazione della variabile locale.
Esempio:
int value = 5; void foo() { int value = 10; printf("%d", value); // stamperà 10, non 5 }
Storia
Storia
static per una funzione e una variabile ausiliaria, causando conflitti di nomi durante il linking, oltre a errori imprevedibili nella compilazione di diverse parti del progetto.Storia
Sono stati riscontrati casi in cui le variabili globali venivano utilizzate in codice multithreading senza la dovuta sincronizzazione. A causa dell'ambito implicito e della disattenzione nella modifica dei valori in thread diversi si sono verificati conflitti di dati (data race).