In der Programmiersprache C wird zwischen Deklaration (declaration) und Definition (definition) unterschieden.
Beispiele:
// Deklaration (extern) extern int global_var; int func(int); // Definition int global_var = 42; int func(int x) { return x * 2; }
In einem mehrmodularen Projekt werden Deklarationen in Header-Dateien platziert, damit die Module "voneinander wissen", und Definitionen nur in einer Quellcodedatei, um Konflikte beim Linken zu vermeiden.
Kann es mehrere identische Definitionen derselben Variablen (zum Beispiel int flag = 0;) in verschiedenen Quellcodedateien geben, wenn sie dasselbe Header-File einbinden?
Antwort: Nein! Die Header-Datei sollte nur die Deklaration extern int flag; enthalten, und die Definition der Variablen sollte nur in einer Quellcodedatei sein (int flag = 0;). Eine Nichteinhaltung führt zu einem Linkerfehler wegen mehrfacher Definition.
Geschichte
In einem großen Projekt wurden globale Variablen in Header-Dateien als
int counter = 0;"geteilt". Dieser Header wurde per Include eingebunden, wodurch die Definition dupliziert wurde. Ergebnis: Linkerfehler beim CI/CD-Bau - “multiple definition of counter”.
Geschichte
In einer Funktionsbibliothek wurden die Prototypen der Funktionen ohne Typenspezifikation erstellt, was der Compiler als veraltete Deklaration behandelte und dann einen Fehler bei der Signaturübereinstimmung zwischen den Modulen gab.
Geschichte
In der Testphase stellte sich heraus, dass einige Variablen nicht initialisiert wurden, da sie nur als
externdeklariert waren, aber in keinem der Module eine Initialisierung stattfand. Dies führte zu einer Auslesung von Müll und schwer fassbaren Bugs auf der Embedded-Plattform.