W języku C rozróżnia się deklarację (declaration) i definicję (definition).
Przykłady:
// Deklaracja (extern) extern int global_var; int func(int); // Definicja int global_var = 42; int func(int x) { return x * 2; }
W projekcie wielomodułowym deklaracje umieszcza się w plikach nagłówkowych, aby moduły "znały się nawzajem", a definicje — tylko w jednym pliku źródłowym, aby uniknąć konfliktów przy łączeniu.
Czy mogą być kilka takich samych definicji tej samej zmiennej (na przykład int flag = 0;) w różnych plikach źródłowych, jeśli używają tego samego pliku nagłówkowego?
Odpowiedź: Nie! Plik nagłówkowy powinien zawierać tylko deklarację extern int flag;, a definicja zmiennej powinna być tylko w jednym pliku źródłowym (int flag = 0;). Niezastosowanie się do tego spowoduje błąd linkera dotyczący wielokrotnej definicji.
Historia
W dużym projekcie “podzielono” zmienne globalne w plikach nagłówkowych jako
int counter = 0;. Dołączono ten nagłówek przez include, co spowodowało duplikację definicji. Efekt: błąd linkera podczas budowania CI/CD — “multiple definition of counter”.
Historia
W bibliotece funkcji stworzono prototypy funkcji bez specyfikacji typów, co kompilator uznał za przestarzałą deklarację, a następnie zgłosił błąd przy niezgodności sygnatur funkcji między modułami.
Historia
Na etapie testowania okazało się, że część zmiennych nie jest inicjowana, ponieważ zostały zadeklarowane tylko jako
extern, a w żadnym z modułów nie było inicjalizacji. Doprowadziło to do odczytu śmieci i trudnych do wykrycia błędów na platformie embedded.