Mi az előretekintés, kar, programozás

A programozás elméletében a "forward" kifejezés egy azonosító deklarációját jelenti (egy objektumot, például egy típust, változót vagy függvényt jelöl), mielőtt a programozó teljes definíciót adott volna neki. Erre azért van szükség, hogy a fordító tudja az azonosító típusát (így meghatározhatja a szükséges memória méretét az objektum létrehozásához, a függvény típusának vagy aláírásának ellenőrzéséhez), és adott esetben az azonosító tartalmazhat egy értéket (változó esetén). Ez egyaránt használható az egyszeres átkapcsolókhoz. A továbbító nyilatkozatot olyan nyelvekhez használják, amelyeknek használatához (C, C + +) kötelező az objektum deklarálása; az ilyen nyelveken kölcsönös rekurzióra van szükség, mivel lehetetlen meghatározni ezeket a funkciókat előzetes meghatározás nélkül egy meghatározásban. Ez akkor is hasznos, ha vizuálisan szervezi a kód struktúráját, például, ha a kód fő részét, a kód fő részét a modul tetején szeretné elhelyezni, és az összes főbb funkciótól.

Más nyelveken, ahol előzetes bejelentés nem szükséges, általában megkövetelik helyett a jelen lévő multi-pass fordítóprogram - azonosítókat kell definiálni (változók kezdeti, a szervezet működésében meghatározott), mielőtt azok fogják használni végrehajtása során a kódot, de nem kell meghatározni, mielőtt Hogyan fogják felhasználni a forráskódban a fordításhoz és értelmezéshez.

Nézzünk egy alapvető példát egy függvény előzetes bejelentésére C:

A C / C ++ nyelven ez a nyilatkozat jelent előre nyilatkozatot funkciót, és egy úgynevezett függvény prototípust. Feldolgozása után ezt a nyilatkozatot a fordító lehetővé teszi a programozó utal printThisInteger tárgy a többi program (ami a szövegben modul az előre nyilatkozatot printThisInteger funkciót, vagy akár egy másik modul). Program, hogy működőképes, a meghatározás a funkciót kell még valahol nyújtott (ugyanabban a modulban fájlt vagy egy másik - nem számít, hogy ez a feladata a linker állítsa be a megfelelő sort a linkeket külön funkció egy vagy több objektumot a definíciós fájlokat ez a funkció):

A változóknak csak előzetes nyilatkozatuk van, definíció nélkül. A kód összeállítása során speciális nyelvi szabályoknak megfelelően indítanak (meg nem határozott értékek, 0, NULL mutatók). A változók meghatározása a másik forrás modul (és ezért úgy tűnik összeállításuk után egy másik objektum fájl) kell egy előre nyilatkozatot, feltéve, hogy kulcsszó extern (a funkciók egy kulcsszót adott használható):

A Pascal Virtovskih és más programozási nyelvek, a fő szabály az, hogy az összes entitást kell bejelenteni használat előtt, így meg kell, hogy egy előre nyilatkozatot, szükséges, például a kölcsönös rekurzió (kölcsönös rekurzió). A C-ban ez a főszabály is működik, de a meghatározatlan funkciók és a befejezetlen típusok esetében kivétel van. Így a C-n lehetséges (bár nemkívánatos) egy pár kölcsönösen rekurzív függvény megvalósítása:

A Pascal-ban ugyanaz a végrehajtás a második függvény előtti nyilatkozatot igényel, hogy az elsőben használható legyen. Ilyen előrejelzés nélkül a fordító hibát generál, mondván, hogy a második azonosítót a definiálás előtt használják.

Néhány objektum-orientált nyelv esetében, mint például a C + + és a Célobjektum-C, néha előfordulhat, hogy az osztályok előtti bejelentését kell alkalmazni (előre deklarálja az osztályt). Ez olyan helyzetekben történik, amikor tudnia kell, hogy az osztály neve egy típus (de egy struktúra számára nem szükséges tudni).

A C ++-ban az osztályok és struktúrák előre jelezhetők így:

C ++ esetén az osztályok előre jelezhetők, hacsak nem kell mutatótípust használni ehhez az osztályhoz (mivel minden objektumra mutató mutató azonos méretű, és a fordítónak gondoskodnia kell róla). Ez különösen hasznos belső osztály definíciókban, például ha egy osztály olyan tagot tartalmaz, amely egy másik osztály tagja; a ciklikus hivatkozások elkerülése érdekében (például ez az osztály tartalmazhat egy olyan tagot is, amely azonos osztályra mutat), egyszerűen csak az osztályok előzetes bejelentését tesszük.

Az osztályra vonatkozó előválasztás nem elegendő, ha érvényes osztálytípust kell használni. Például, ha olyan osztály tagja van, amely nem mutatós típusú, de közvetlenül az osztályt állítja be, vagy alapszintként használja, vagy ha más osztályú módszereket kell használni egy másik módszerrel.

A C-célkitűzésben az osztályok és protokollok előre jelezhetők így:

A C-C objektumban az osztályok és protokollok előre jelezhetők, hacsak nem az objektummutató típusának részeként kell használni őket, például a MyClass * -nak vagy az id . Ez különösen hasznos belső osztály definíciókban, például, ha az osztály olyan tagokat tartalmaz, amelyek más osztályokra mutatnak; a ciklikus hivatkozások elkerülése érdekében (például ez az osztály tartalmazhat egy olyan tagot is, amely azonos osztályra mutat), egyszerűen csak az osztályok előzetes bejelentését tesszük.

Az osztályra vagy protokollra vonatkozó előredezeti nyilatkozat alkalmazása nem elég, ha szüksége van ennek az osztálynak az alosztály alosztályára, vagy ha ezt a protokollt végre kell hajtania.

Példa (érvényes) előrejelzés C ++-ban:

Ebben a példában két hivatkozás van a myValue-ra, mielőtt ezt a változót meghatározták. A C ++ többnyire tiltja az előremenet referencia használatát, de ez különleges esetekben megengedett az osztály tagjai számára. Mivel a függvény egy tagjának az elérhetőségi osztály nem lehet összeállítani, amíg a fordító nem ismeri fel a tanulót változó típusa myValue ez kötelessége, hogy emlékezzen a meghatározása a fordító elérési, amíg nem látja a nyilatkozat myValue.

Az előremenet referencia használatának lehetővé tétele jelentősen megnehezítheti a fordítást és növelheti a fordító memóriaigényét, és ez általában nem teszi lehetővé, hogy a fordítást egyetlen lépésben végezzék el.

1. Előzetes nyilatkozat oldal: en.wikipedia.org.