Soru geçmişi:
C dilinde, bir yapının diğerini "bilmesi" gerektiği bazı durumlar vardır, ancak her iki yapının tanımının birbirine bağlı olduğu (karşılıklı iç içe geçme) durumlarda, ikinci yapı tanımlanmadan bir yapıyı tamamen tanımlamak mümkün değildir. Bunu yapmak için C dilinde yapıların ön bildirimine (forward declaration) yer verilmiştir.
Sorun:
Ön bildirim olmadan, derleyici yapının içinde ne tür bir tip olduğunu bilmez ve bilinmeyen tip hakkında hata verir. Özellikle, başka bir yapıyı değer olarak değil, işaretçi olarak içeren bir yapı oluşturmaya çalışırken sıkça hata meydana gelir veya sözdizimini yanlış yazarız.
Çözüm:
Forward declaration, yapının tam tanımını açıklamadan bir yapıya işaretçi oluşturmak gerektiğinde kullanılır. Sözdizimi — struct A;. Tam tanım (struct A { ... };) daha sonra verilebilir.
Kod örneği:
struct B; // ileri bildirim struct A { int val; struct B *link; }; struct B { int id; struct A *parent; };
Anahtar özellikler:
"Değer olarak başka bir yapının alanını" forward declaration ile yapmak mümkün mü?
Hayır, forward declaration, türün yalnızca işaretçi olarak kullanılmasına izin verir, aksi halde hata alırsınız: türün boyutu bilinmemektedir.
struct B; // tamam struct A { struct B b; // hata: B'nin boyutu bilinmiyor };
Farklı dosyalarla çalışırken forward declaration nerede doğru yerleştirilmeli?
Forward declaration, yapı yalnızca işaretçi olarak kullanılıyorsa başlıkta yer almalıdır. Tam tanım ya başka bir başlıkta ya da uygulama dosyasında verilmelidir.
Forward declaration, yapıların boyutunu ve doğru bellek tahsisini etkiler mi?
Hayır, çünkü C "belirsiz" yapının boyutunu bilmez, ve işaretçi, belirtilen türden bağımsız olarak derleyici için her zaman aynı boyuta sahiptir.
Başlık dosyasında her iki modül de birbirlerinin alanlarına değer olarak sahip yapılar içermekteydi. Derleme, tanımsız tip hatası ile başarısız oldu.
Artılar:
Eksiler:
Bir programcı, forward declaration ve işaretçileri kullanarak başlıklardaki gereksiz bağımlılıkları minimize etti. Kodun derlenmesi ve bakımı daha kolay hale geldi.
Artılar:
Eksiler: