ProgramlamaC/Gömülü geliştirici

C dilinde fonksiyonlar ve değişkenlerin bildirilmesi ile tanımlanması arasındaki farkı açıklayın. Çok modüllü bir projede bu kuralların ihlal edilirse ne olur?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

C dilinde bildirim (declaration) ve tanım (definition) arasında bir ayrım vardır.

  • Bildirim derleyiciye bir fonksiyon veya değişkenin varlığını ve türünü bildirir, ancak bellek ayırmaz.
  • Tanım nesneyi veya fonksiyonun gövdesini belirler ve aslında değişken için bellek ayırır veya fonksiyonun kodunu yerleştirir.

Ö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.

Aldatıcı Soru

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.

Gerçek hatalarla ilgili örnekler


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 extern olarak 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ı.