In de C-taal wordt een verklaring (declaration) onderscheiden van een definitie (definition).
Voorbeelden:
// Verklaring (extern) extern int global_var; int func(int); // Definitie int global_var = 42; int func(int x) { return x * 2; }
In een multi-module project worden verklaringen in header-bestanden geplaatst, zodat modules "van elkaar weten", en definities alleen in één bronbestand, om conflicten tijdens het linken te voorkomen.
Kunnen er meerdere identieke definities van dezelfde variabele (bijvoorbeeld int flag = 0;) zijn in verschillende bronbestanden, als ze dezelfde header gebruiken?
Antwoord: Nee! Het header-bestand moet alleen de verklaring extern int flag; bevatten, en de definitie van de variabele moet slechts in één bronbestand zijn (int flag = 0;). Het niet naleven hiervan zal leiden tot een linkerfout over meerdere definities.
Verhaal
In een groot project “verdeelden” ze globale variabelen in header-bestanden als
int counter = 0;. Ze includeerden deze header, wat leidde tot duplicatie van de definitie. Resultaat: linkerfout tijdens het bouwen van CI/CD — “multiple definition of counter”.
Verhaal
In de functie bibliotheek werden de functie prototypes gemaakt zonder type specificatie, waardoor de compiler dit als verouderde verklaring beschouwde en vervolgens een fout gaf vanwege het niet overeenkomen van functiehandtekeningen tussen de modules.
Verhaal
Tijdens de testfase bleek dat sommige variabelen niet werden geïnitialiseerd, omdat ze alleen als
externwaren gedeclareerd, maar in geen van de modules was een initiatie aanwezig. Dit leidde tot het lezen van rommel en moeilijk te traceren bugs op een embedded platform.