У програмуванні попереднє оголошення — це оголошення ідентифікатора (типу, змінної або функції), для якого програміст ще не дав повного визначення. Оголошення ідентифікатора потрібне компілятору для того, щоб знати тип (розмір) ідентифікатора, але не його значення (у випадку змінних).
Попереднє оголошення є таким типом оголошення, завдяки якому складальник (компілятор) має можливість розв'язати посилання з різних частин програми. Попереднє оголошення дозволяє програмісту посилатися на об'єкти, про яких компілятор ще не знає, але які будуть визначені в процесі компіляції пізніше.
void printThisInteger(int);
В C/, наведений рядок означає попереднє оголошення функції і є її прототипом. Після обробки цього оголошення, компілятор дає можливість програмісту посилатися на сутність printThisInteger у решті частини програми. Визначення функції має бути описане десь ще (в тому ж або іншому файлі; завдання компонувальника — зіставити посилання на цю функцію в одному або декількох об'єктних файлах з її єдиним визначенням в іншому):
void printThisInteger(int x) { printf("%d\n", x); }
Змінні можуть бути оголошені і не визначені. Такі змінні в процесі компіляції ініціалізуються згідно з правилами мови (невизначеним значенням, нулем, NULL-вказівником тощо). Змінні, що мають визначення в іншому сирцевому/об'єктному файлі, слід попередньо оголосити з ключовим словом extern:
int foo; //foo могло бути визначене десь у цьому файлі extern int bar; //bar має бути визначене в іншому файлі
В Паскалі та інших віртівських мовах програмування той факт, що всі сутності мають бути оголошені до першого використання — загальне правило. У мові C застосовується таке саме правило, з винятком для неоголошених функцій і неповних типів. Так, у C є можливість реалізації пари взаємно-рекурсивних функцій:
int first(int x) { if (x == 0) return 1; return second(x-1); //випереджальне звернення до second } int second(int x) { if (x == 0) return 0; return first(x-1); }
У Паскалі аналогічна реалізація вимагає попереднього оголошення функції second до першого її використання. Без попереднього оголошення компілятор видасть повідомлення про помилку, яке означає, що ідентифікатор second використано без оголошення.
Випереджальне посилання (звернення)
Термін «випереджальне посилання» іноді вживаються як синонім попереднього оголошення. Проте найчастіше під випереджальним посиланням (зверненням) мають на увазі фактичне використання сутності до будь-якого оголошення; тобто звернення до second у прикладі вище є випереджувальним посиланням. Таким чином, зважаючи на те, що попереднє оголошення в Паскалі обов'язкове, випереджальні посилання (звернення) в ньому заборонені.
Приклад випереджального посилання в C++:
class C { public: void mutator(int x) { myValue = x; } int accessor() { return myValue; } private: int myValue; };
У цьому прикладі атрибут myValue двічі використано до його оголошення. C++ в цілому забороняє випереджальні звернення. Вони дозволені в особливому випадку: для членів класу. Метод, що змінює атрибут, не може бути скомпільований до того, як компілятору стане відомо про існування myValue. Тому компілятор мусить пам'ятати опис методу, поки він не побачить оголошення myValue.
Обслуговування випереджальних посилань (звернень) може значно підвищити складність і вимоги до пам'яті компілятора. Зазвичай це стає перешкодою для реалізації однопрохідного компілятора.
Див. також
Примітки
- MSDN: Converting to a Forward-Reference Class Type
- http://pages.cs.wisc.edu/~fischer/cs536.s07/lectures/Lecture25.4up.pdf
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U programuvanni poperednye ogoloshennya ce ogoloshennya identifikatora tipu zminnoyi abo funkciyi dlya yakogo programist she ne dav povnogo viznachennya Ogoloshennya identifikatora potribne kompilyatoru dlya togo shob znati tip rozmir identifikatora ale ne jogo znachennya u vipadku zminnih Poperednye ogoloshennya ye takim tipom ogoloshennya zavdyaki yakomu skladalnik kompilyator maye mozhlivist rozv yazati posilannya z riznih chastin programi Poperednye ogoloshennya dozvolyaye programistu posilatisya na ob yekti pro yakih kompilyator she ne znaye ale yaki budut viznacheni v procesi kompilyaciyi piznishe void printThisInteger int V C C navedenij ryadok oznachaye poperednye ogoloshennya funkciyi i ye yiyi prototipom Pislya obrobki cogo ogoloshennya kompilyator daye mozhlivist programistu posilatisya na sutnist printThisInteger u reshti chastini programi Viznachennya funkciyi maye buti opisane des she v tomu zh abo inshomu fajli zavdannya komponuvalnika zistaviti posilannya na cyu funkciyu v odnomu abo dekilkoh ob yektnih fajlah z yiyi yedinim viznachennyam v inshomu void printThisInteger int x printf d n x Zminni mozhut buti ogolosheni i ne viznacheni Taki zminni v procesi kompilyaciyi inicializuyutsya zgidno z pravilami movi neviznachenim znachennyam nulem NULL vkazivnikom tosho Zminni sho mayut viznachennya v inshomu sircevomu ob yektnomu fajli slid poperedno ogolositi z klyuchovim slovom extern int foo foo moglo buti viznachene des u comu fajli extern int bar bar maye buti viznachene v inshomu fajli V Paskali ta inshih virtivskih movah programuvannya toj fakt sho vsi sutnosti mayut buti ogolosheni do pershogo vikoristannya zagalne pravilo U movi C zastosovuyetsya take same pravilo z vinyatkom dlya neogoloshenih funkcij i nepovnih tipiv Tak u C ye mozhlivist realizaciyi pari vzayemno rekursivnih funkcij int first int x if x 0 return 1 return second x 1 viperedzhalne zvernennya do second int second int x if x 0 return 0 return first x 1 U Paskali analogichna realizaciya vimagaye poperednogo ogoloshennya funkciyi second do pershogo yiyi vikoristannya Bez poperednogo ogoloshennya kompilyator vidast povidomlennya pro pomilku yake oznachaye sho identifikator second vikoristano bez ogoloshennya Viperedzhalne posilannya zvernennya Termin viperedzhalne posilannya inodi vzhivayutsya yak sinonim poperednogo ogoloshennya Prote najchastishe pid viperedzhalnim posilannyam zvernennyam mayut na uvazi faktichne vikoristannya sutnosti do bud yakogo ogoloshennya tobto zvernennya do second u prikladi vishe ye viperedzhuvalnim posilannyam Takim chinom zvazhayuchi na te sho poperednye ogoloshennya v Paskali obov yazkove viperedzhalni posilannya zvernennya v nomu zaboroneni Priklad viperedzhalnogo posilannya v C class C public void mutator int x myValue x int accessor return myValue private int myValue U comu prikladi atribut myValue dvichi vikoristano do jogo ogoloshennya C v cilomu zaboronyaye viperedzhalni zvernennya Voni dozvoleni v osoblivomu vipadku dlya chleniv klasu Metod sho zminyuye atribut ne mozhe buti skompilovanij do togo yak kompilyatoru stane vidomo pro isnuvannya myValue Tomu kompilyator musit pam yatati opis metodu poki vin ne pobachit ogoloshennya myValue Obslugovuvannya viperedzhalnih posilan zvernen mozhe znachno pidvishiti skladnist i vimogi do pam yati kompilyatora Zazvichaj ce staye pereshkodoyu dlya realizaciyi odnoprohidnogo kompilyatora Div takozhOblast vidimosti programuvannya Prototip funkciyiPrimitkiMSDN Converting to a Forward Reference Class Type http pages cs wisc edu fischer cs536 s07 lectures Lecture25 4up pdf