Le variabili globali sono state introdotte nel linguaggio C fin dall'inizio come mezzo per memorizzare dati accessibili in tutte le funzioni del programma. Consentono di organizzare lo scambio di informazioni tra diverse parti del codice senza la necessità di passare esplicitamente i valori tramite i parametri delle funzioni. Tali variabili sono memorizzate in un'area di memoria separata e esistono per tutta la durata del programma.
Un uso eccessivo e incontrollato delle variabili globali porta a problemi di manutenzione del codice, complica la ricerca di errori e aumenta i rischi di conflitti di nomi. In progetti di grandi dimensioni è difficile capire dove avviene la modifica dei dati accessibili globalmente, il che complica il debugging. Inoltre, una dichiarazione errata delle variabili globali in diversi file (moduli) può portare a errori di collegamento (linker errors) e duplicazione dei dati.
La pratica ottimale è quella di dichiarare esplicitamente le variabili globali in un unico file .c e portare i loro prototipi con la parola chiave extern nei file di intestazione .h. In questo modo si ottiene un'unica posizione di memorizzazione, il compilatore previene la duplicazione. Per minimizzare le variabili globali, si utilizzano variabili statiche con ambito di visibilità all'interno del file. L'uso eccessivo dello stato globale è sostituito da strutture dati che vengono passate tra le funzioni.
Esempio di codice:
// file.h #ifndef FILE_H #define FILE_H extern int global_counter; #endif // file.c #include "file.h" int global_counter = 0; // main.c #include "file.h" #include <stdio.h> int main() { global_counter++; printf("%d\n", global_counter); return 0; }
Caratteristiche chiave:
È possibile dichiarare una variabile globale come statica? In che modo differirebbe da una variabile globale normale?
Sì, una variabile globale dichiarata con la parola chiave static sarà visibile solo all'interno del file in cui è stata dichiarata. Essa vive ancora per tutta la durata del programma, ma un'altra compilazione (un altro file .c) non potrà accedervi. Questo è utilizzato per l'incapsulamento dei dati a livello di file.
È necessario utilizzare extern per accedere a una variabile globale da un altro file?
Sì, se si desidera accedere a una variabile globale definita in un altro modulo, è necessario dichiararla con la parola chiave extern (di solito nel file di intestazione). Altrimenti, il compilatore considererà che si stia ridefinendo la variabile.
// a.c int global_var = 1; // b.c extern int global_var;
Funzionerà il seguente codice?
// a.c int var; // b.c int var;
No, tale codice porterà a un errore di collegamento, poiché la variabile è definita due volte. La definizione di una variabile globale deve essere unica, per l'accesso si deve utilizzare extern.
Lo sviluppatore colloca parametri di configurazione in variabili globali senza limitazioni di accesso:
Pro:
Contro:
Le variabili globali vengono definite solo in un file, sono accessibili attraverso extern e documentate rigorosamente. In altri casi si utilizza l'ambito statico del file o la strutturazione dei parametri:
Pro:
Contro: