Geschiedenis van de kwestie:
Lokale en globale variabelen zijn ontstaan in C voor geheugenbeheer en scope van de code. Voorheen waren globale variabelen de belangrijkste manier om gegevens tussen functies uit te wisselen, nog vóór de opkomst van modulair programmeren, terwijl lokale variabelen de interactie verminderden en de isolatie van de code verhoogden.
Probleem:
Er is vaak een misverstand over de verschillen tussen globale en lokale variabelen: hun levensduur, scope, regels en tijdstip van initialisatie. Globale variabelen leiden tot synchronisatie- en leesbaarheidproblemen, terwijl lokale variabelen kunnen leiden tot ontoegankelijkheid van benodigde gegevens. Fouten in het begrip van deze verschillen leiden tot bugs en bemoeilijken de schaalbaarheid van de code.
Oplossing:
Globale variabelen worden buiten alle functies gedeclareerd en zijn toegankelijk in alle bestanden met extern gebruik. Hun levensduur is de volledige looptijd van het programma, en initialisatie gebeurt ofwel impliciet met nullen (voor statische variabelen) of expliciet met de waarde van de gebruiker. Lokale variabelen worden binnen functies gedeclareerd, hun levensduur is beperkt tot het aanroepen van de functie en hun inhoud wordt niet automatisch geïnitialiseerd.
Voorbeeldcode:
int g_var = 42; // Globale variabele void foo() { int l_var = 5; // Lokale variabele }
Belangrijke kenmerken:
Wordt een lokale variabele automatisch geïnitialiseerd op nul als er geen beginwaarde is opgegeven?
Nee. Alleen globale en statische variabelen worden standaard op nullen geïnitialiseerd. Lokale variabelen bevatten "rommel" (onbekende waarde) als er niet expliciet een startwaarde wordt gegeven.
Voorbeeld:
void test() { int a; printf("%d\n", a); // Onbepaald gedrag }
Kun je altijd toegang krijgen tot een globale variabele vanuit verschillende bestanden?
Nee. Als een variabele als static buiten een functie is gedeclareerd, is deze alleen zichtbaar in dat bronbestand. Voor globale zichtbaarheid, gebruik extern.
Kun je een globale variabele binnen een functie declareren?
Nee. Binnen een functie zijn alle declaraties lokaal. Alleen buiten functies kunnen globale variabelen worden gemaakt.
Een globale variabele wordt gebruikt voor gegevensuitwisseling tussen functies:
int error_code; void f1() { error_code = 1; } void f2() { if (error_code) ... }
Voordelen:
Nadelen:
Alle variabelen zijn lokaal, gegevens worden doorgegeven via functieparameters:
void f1(int *err) { *err = 1; } void f2(int err) { if (err) ... }
Voordelen:
Nadelen: