A forward deklaráció egy olyan deklaráció, amelyben az assembler (fordító) képes feloldani a program különböző részeiről származó hivatkozásokat. A továbbító deklaráció lehetővé teszi a programozó számára, hogy olyan objektumokra hivatkozzon, amelyekről a fordító még nem tud, de amelyeket később a fordítási folyamat során határoznak meg.
A programozásban a forward deklaráció egy olyan azonosító (típus, változó vagy függvény) deklarációja, amelyre a programozó még nem definiálta teljesen. Az azonosító deklarációra azért van szükség a fordítónak, hogy ismerje az azonosító típusát (méretét), de nem (változók esetén) az értékét.
void printThisInteger ( int );A C/C++ nyelvben az adott karakterlánc egy függvény előremenő deklarációját jelenti, és a prototípusa. A deklaráció feldolgozása után a fordító lehetővé teszi a programozó számára, hogy a program többi részében hivatkozzon a printThisInteger entitásra. A függvénydefiníciót valahol máshol kell deklarálni (ugyanabban vagy másik fájlban; a linker feladata , hogy egy vagy több objektumfájlban egy adott függvényre mutató hivatkozásokat párosítson a másikban található egyetlen definíciójával):
void printThisInteger ( int x ) { printf ( "%d \n " , x ); }A változók deklarálhatók vagy nem. Az ilyen változókat a fordítás során inicializáljuk a nyelv szabályai szerint (undefined value, nulla, NULL pointer, ...). A másik forrás-/objektumfájlban definiált változókat előre deklarálni kell az extern kulcsszóval:
int foo ; //foo definiálható valahol ebben a fájlban extern int bar ; A //bar-ot egy másik fájlban kell meghatározniA Pascal és más Wirth programozási nyelvekben általános szabály, hogy minden entitást deklarálni kell az első használat előtt. C-ben ugyanez a szabály érvényes, kivételt képezve a nem deklarált függvényekre és a hiányos típusokra. Tehát C-ben lehetőség van egy pár kölcsönösen rekurzív függvény megvalósítására:
int első ( int x ) { ha ( x == 0 ) visszatérés 1 ; vissza második ( x -1 ); // nézz előre a másodikra } int másodperc ( int x ) { ha ( x == 0 ) return 0 ; először térjen vissza ( x -1 ); }Pascalban egy hasonló megvalósítás megköveteli a második függvény előzetes deklarálását az első használat előtt. Továbbítási deklaráció nélkül a fordító hibaüzenetet ad ki, jelezve, hogy a második azonosítót deklarálás nélkül használták fel.
A "további hivatkozás" kifejezést néha a továbbítási nyilatkozat szinonimájaként használják [1] . Leggyakrabban azonban az előremutató hivatkozás (hivatkozás) az entitás tényleges használatára utal bármely nyilatkozat előtt; vagyis a fenti példában a másodikra való hivatkozás egy előremutató hivatkozás [2] [3] . Tekintettel tehát arra, hogy a Pascal-ban kötelező a továbbítási nyilatkozat, tilos benne az előre utalás (hivatkozás).
Példa egy előremutató hivatkozásra C++ nyelven:
osztály C { nyilvános : void mutátor ( int x ) { myValue = x ; } int accessor () { return myValue ; } privát : int myValue ; };Ebben a példában a myValue attribútumnak két használata van a deklarálás előtt. A C++ általában nem engedélyezi az előretekintést. Speciális esetben megengedett: osztálytagok. Egy attribútumot módosító metódust nem lehet lefordítani addig, amíg a fordító nem tudja, hogy a myValue létezik. Ezért a fordító felelőssége, hogy emlékezzen a metódus deklarációjára, amíg meg nem látja a myValue deklarációt.
Az előremenő hivatkozások (hivatkozások) kiszolgálása nagymértékben növelheti a fordító bonyolultságát és memóriaigényét. Ez általában egy menetben akadályozza a fordítóprogram megvalósítását.