În teoria programării, termenul de declarație în avans înseamnă declararea unui identificator (care denotă un obiect cum ar fi un tip, o variabilă sau o funcție) înainte ca programatorul să-i dea o definiție completă. Acest lucru este necesar pentru ca compilatorul să cunoască tipul identificatorului (astfel încât să puteți determina dimensiunea necesară a memoriei pentru crearea obiectului, pentru a verifica tipul sau semnătura funcției) și, opțional, identificatorul poate conține o valoare (în cazul unei variabile). Acest lucru este, de asemenea, util pentru compilatoare single-pass. Declaratia inainte este folosita in limbile care necesita declararea unui obiect inainte de ao folosi (C, C ++); este necesară în astfel de limbi pentru recursiune reciprocă, deoarece este imposibil să se definească aceste funcții fără referire în avans la o definiție. Acest lucru este, de asemenea, util pentru organizarea vizuală a structurii codului, de exemplu dacă doriți să plasați partea principală, partea principală a codului în partea de sus a modulului și sub toate funcțiile solicitate din această parte principală.
În alte limbi, în cazul în care declarația preliminară nu este necesar, de obicei, necesită în schimb prezența compilator multi-pass - identificatori trebuie să fie definite (variabilele sunt inițializate, funcțiile organismului definit) înainte ca acestea vor fi folosite în timpul executării codului, dar ele nu au nevoie pentru a defini înainte Cum vor fi folosite în codul sursă pentru compilare și interpretare.
Să analizăm un exemplu de bază de pre-declarare a unei funcții în C:
În limbile C / C ++ această declarație reprezintă o funcție de declarație înainte, și un așa-numit prototip funcția. După procesarea acestei declarații compilatorul permite programatorului să se facă referire la obiectul printThisInteger în restul programului (care se află în modulul de text pentru funcția transmite declarația printThisInteger, sau chiar într-un alt modul). Programul să fie operabil, definiția pentru funcția trebuie să fie în continuare acordate undeva (în același fișier modul, sau într-un alt - nu contează, este de datoria verigii stabilit linia corectă de link-uri pentru a separa funcții într-una sau mai multe obiecte la fișierele de definire a această funcție):
Variabilele pot avea doar o declarație preliminară, fără o definiție. În timpul compilării codului, acestea vor fi inițializate conform regulilor de limbă speciale (la valori nedefinite, 0, indicatori NULL.). Variabilele definite într-un alt modul sursă (și vor apărea în consecință după compilarea într-un alt fișier obiect) trebuie să aibă o declarație în avans reprezentată cu cuvântul cheie extern (pentru funcții, acest cuvânt cheie este opțional):
În Pascal Virtovskih și alte limbaje de programare, regula principală este că toate entitățile trebuie declarate înainte de utilizare, astfel încât trebuie să utilizați o declarație înainte, este necesar, de exemplu, pentru recursivitate reciprocă (recursivitatea reciprocă). limbajul C este principala regulă, de asemenea, funcționează, dar există o excepție pentru funcțiile nedefinite și tipurile incomplete. Astfel, C este posibilă (deși puțin probabil) să pună în aplicare o pereche de funcții reciproc recursive:
În Pascal, aceeași implementare necesită o declarație înainte pentru a doua funcție, astfel încât să poată fi utilizată în prima. Fără o astfel de declarație în avans, compilatorul va genera o eroare care vă spune că cel de-al doilea identificator este utilizat înainte de a fi definit.
Pe unele limbi orientate pe obiecte, cum ar fi C ++ și Obiectiv-C, uneori trebuie să aplicați pre-declararea pentru clase (clasa de declarare înainte). Acest lucru se întâmplă în situațiile în care trebuie să știți că numele clasei este un tip (dar pentru o structură nu este necesar să știți).
În C ++, clasele și structurile pot fi declarate astfel:
În C ++, clasele pot fi declarate înainte, cu excepția cazului în care aveți nevoie să utilizați un tip de pointer la această clasă (deoarece toate indicii pentru obiecte sunt de aceeași mărime și compilatorul ar trebui să aibă grijă de el). Acest lucru este util în special în interiorul definițiilor clasei, de exemplu dacă o clasă conține un membru care este membru al unei alte clase; pentru a evita referințele ciclice (de exemplu, această clasă poate conține și un membru care indică aceeași clasă), facem doar o declarație preliminară a claselor.
O declarație în avans pentru o clasă nu este suficientă dacă trebuie să utilizați un tip de clasă valabil. De exemplu, dacă aveți un membru dintr-o clasă care are un tip non-pointer, dar stabilește direct clasa sau dacă o folosiți ca o clasă de bază sau dacă trebuie să utilizați metode din această clasă într-o altă metodă.
În Obiectiv-C, clasele și protocoalele pot fi declarate astfel:
În Obiectiv-C, clasele și protocoalele pot fi declarate înainte, cu excepția cazului în care aveți nevoie să le utilizați ca parte a tipului de indicii de obiect, de exemplu MyClass * sau id
Aplicarea unei declarații forward pentru o clasă sau un protocol nu este suficientă dacă aveți nevoie de o subclasă de subclasă din această clasă sau dacă trebuie să implementați acest protocol.
Exemplu (valabil) referință înainte în C ++:
În acest exemplu, există două referiri la myValue înainte ca această variabilă să fie definită. C ++ interzice în principal utilizarea de referință înainte, dar este permisă într-un eveniment special pentru membrii clasei. Deoarece funcția unui membru al clasei accesor nu pot fi compilate până când compilatorul nu recunoaște membru al clasei de tip variabilă myValue, este o datorie să-și amintească definiția accessor compilator, până când vede myValue declarație.
Permiterea utilizării referinței înainte poate complica în mod semnificativ compilația și crește cerințele de memorie ale compilatorului și de obicei acest lucru nu permite compilarea într-o singură trecere.
1. Site-ul declarației de intenție: en.wikipedia.org.