Declaratie en initialisatie van variabelen zijn de hoekstenen van de taal C met zeer strikte en soms niet-voor de hand liggende regels. Hoe en waar je een variabele declareert, zal zelfs haar initiële waarde (over initialisatie) beïnvloeden, evenals de verbinding met een geheugenobject (over declaratie en definitie).
C dateert uit een tijd waarin geheugenoptimalisatie een prioriteit was. Ontwikkelaars moesten variabelen zelf declareren en initialiseren, anders werd het gedrag van het programma onvoorspelbaar. In moderne C-compilers leidt zelfs een kleine afwijking tot linkerfouten of impliciete initialisatie met "troep".
Belangrijkste fouten:
Codevoorbeeld:
#include <stdio.h> int global_var; // definitie, auto-initialisatie = 0 static int static_global_var; // static-bestand, auto-initialisatie = 0 extern int extern_var; // declaratie, definitie ergens anders void foo() { int local_var; // automatisch, niet geïnitieerd -> troep static int static_local_var; // static, auto-geïnitialiseerd naar 0 }
Belangrijke kenmerken:
1. Worden automatische variabelen (lokale zonder static en extern) automatisch geïnitieerd door de compiler in 0?
Nee, bevatten troep. Hun waarde is niet gedefinieerd, gebruik voor initialisatie — fout.
2. Kan een variabele met extern meerdere keren in verschillende bestanden worden gedefinieerd?
Nee, er is één definitie nodig, de overige zijn declaraties via extern, anders geeft de linker een fout "meerdere definities" of "ongedefinieerd symbool".
3. Wat is het verschil tussen de declaratie van een functie en haar definitie?
Declaratie — alleen een prototype (zonder lichaam); definitie — bevat altijd het lichaam van de functie. Voor variabelen reserveert een declaratie via extern geen geheugen, en voor functies zijn beide vormen toegestaan.
Er wordt een globale variabele int counter; in twee headerbestanden gedeclareerd. Het project gelinkte met een fout 'meerdere definities'.
Voordelen:
Nadelen:
In de header is extern int counter; beschreven, definitie int counter = 0; — alleen in één C-bestand.
Voordelen:
Nadelen: