C dilinde bildirim (declaration) ve tanım (definition) arasında bir ayrım vardır.
Örnekler:
// Bildirim (extern) extern int global_var; int func(int); // Tanım int global_var = 42; int func(int x) { return x * 2; }
Çok modüllü bir projede, bildirimler başlık dosyalarında yer alır, böylece modüller "birbirlerinden haberdar" olur, tanımlar ise yalnızca bir kaynak dosyasında yer alır, böylece bağlantı sırasında çakışma olmaz.
Aynı değişkenin birden fazla aynı tanımının (örneğin, int flag = 0;) farklı kaynak dosyalarında, aynı başlık dosyasını dahil ettiğinde olabilir mi?
Cevap: Hayır! Başlık dosyası yalnızca extern int flag; bildirimini içermeli, değişkenin tanımı ise yalnızca bir kaynak dosyasında (int flag = 0;) olmalıdır. Uymamak bağlantı hatasına yol açar ve çoklu tanım hatası alınır.
Hikaye
Büyük bir projede küresel değişkenler başlık dosyalarında
int counter = 0;şeklinde "bölüştürüldü". Bu başlığı include ile dahil ettikleri için tanımın çoğaltılmasına yol açtılar. Sonuç: CI/CD derlemesi sırasında derleyicide “counter için çoklu tanım” hatası.
Hikaye
Fonksiyon kütüphanesinde fonksiyon prototipleri tür spesifikasyonu olmadan yapıldı, bu yüzden derleyici bunu eski bir bildirim olarak yavaşlattı ve daha sonra modüller arasında fonksiyon imzalarının uyumsuzluğu nedeniyle hata verdi.
Hikaye
Test aşamasında bazı değişkenlerin başlatılmadığı ortaya çıktı çünkü yalnızca
externolarak bildirilmiş, ancak hiçbir modülde başlatma yapılmamıştı. Bu, rastgele verilerin okunmasına ve gömülü platformda zor fark edilen hatalara yol açtı.