Achtergrond:
In de programmeertaal C is het soms nodig dat de ene structuur op de hoogte is van een andere, maar de definitie van beide structuren afhankelijk is van elkaar (wederzijdse nesteling). Dan is het onmogelijk om de ene structuur volledig te definiëren voordat de tweede is gedeclareerd. Voor deze situatie is in C forward declaration van structuren beschikbaar.
Probleem:
Zonder forward declaration weet de compiler niet welk type er binnen de structuur voorkomt en geeft een foutmelding over een onbekend type. Vaak ontstaat er een fout wanneer we proberen een structuur te maken die een andere op waarde bevat in plaats van via een pointer, of wanneer de syntaxis verkeerd is geschreven.
Oplossing:
Forward declaration wordt toegepast als je een pointer naar een structuur wilt maken zonder deze volledig te definiëren. De syntaxis is struct A;. De volledige definitie (struct A { ... };) kan later worden gegeven.
Voorbeeld code:
struct B; // forward declaration struct A { int val; struct B *link; }; struct B { int id; struct A *parent; };
Belangrijke kenmerken:
Is het mogelijk om een veld van het type "andere structuur op waarde" te maken via forward declaration?
Nee, forward declaration staat alleen het gebruik van het type toegestaan toe in de vorm van een pointer, anders krijg je een foutmelding: de grootte van het type is onbekend.
struct B; // ok struct A { struct B b; // fout: grootte van B is onbekend };
Waar moet je forward declaration juist plaatsen bij het werken met verschillende bestanden?
Forward declaration wordt in de header geplaatst als de structuur alleen als pointer wordt gebruikt. De volledige definitie kan in een andere header of in het implementatiebestand staan.
Beïnvloedt forward declaration de grootte van structuren en de juiste geheugenallocatie?
Nee, omdat C de grootte van een "onbepaalde" structuur niet kent, en een pointer altijd dezelfde grootte heeft voor de betreffende compiler, ongeacht het gedeclareerde type.
In de header bevatten beide modules structuren met velden van elkaar op waarde. De compilatie faalde met een foutmelding over een onbekend type.
Voordelen:
Nadelen:
Een van de programmeurs gebruikte forward declaration en pointers, waardoor overbodige afhankelijkheden in de headers werden geminimaliseerd. Compilatie en code-ondersteuning werd eenvoudiger.
Voordelen:
Nadelen: