La dichiarazione e l'inizializzazione delle variabili sono la pietra angolare del linguaggio C, con regole molto rigide e a volte non ovvie. Dipende da come e dove hai dichiarato una variabile, il suo valore iniziale (riguardo l'inizializzazione) e la connessione con l'oggetto di memoria (riguardo la dichiarazione e la definizione).
Il C risale a tempi in cui l'ottimizzazione della memoria era una priorità. Gli sviluppatori dovevano dichiarare e inizializzare le variabili da soli, altrimenti il comportamento del programma diventava imprevedibile. Nei moderni compilatori C, anche una piccola deviazione porta a errori di collegamento o a un'inizializzazione implicita "spazzatura".
Errori principali:
Esempio di codice:
#include <stdio.h> int global_var; // definizione, auto-inizializzazione = 0 static int static_global_var; // static-file, auto-inizializzazione = 0 extern int extern_var; // dichiarazione, definizione da qualche altra parte void foo() { int local_var; // automatica, non inizializzata -> spazzatura static int static_local_var; // static, auto-inizializzata a 0 }
Caratteristiche chiave:
1. Le variabili automatiche (locali senza static e extern) sono inizializzate dal compilatore automaticamente a 0?
No, contengono spazzatura. Il loro valore non è definito, usarle prima dell'inizializzazione è un errore.
2. È possibile definire più volte una variabile con extern in diversi file?
No, è necessaria una sola definizione, le altre devono essere dichiarazioni tramite extern, altrimenti il linker restituirà un errore "multiple definition" o "undefined symbol".
3. Qual è la differenza tra la dichiarazione di una funzione e la sua definizione?
La dichiarazione è solo un prototipo (senza corpo); la definizione deve contenere il corpo della funzione. Per le variabili, la dichiarazione tramite extern non riserva memoria, mentre per le funzioni entrambe le forme sono consentite.
Una variabile globale int counter; è dichiarata in due file header. Il progetto ha generato un errore di collegamento multiple definition.
Vantaggi:
Svantaggi:
Nel header è specificato extern int counter;, definizione int counter = 0; — solo in un file C.
Vantaggi:
Svantaggi: