Попереднє оголошення

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

У програмуванні попереднє оголошення — це оголошення ідентифікатора (типу, змінної або функції), для якого програміст ще не дав повного визначення. Оголошення ідентифікатора потрібне компілятору для того, щоб знати тип (розмір) ідентифікатора, але не його значення (у випадку змінних).

Попереднє оголошення є таким типом оголошення, завдяки якому складальник (компілятор) має можливість розв'язати посилання з різних частин програми. Попереднє оголошення дозволяє програмісту посилатися на об'єкти, про яких компілятор ще не знає, але які будуть визначені в процесі компіляції пізніше.

void printThisInteger(int);

В C/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 використано без оголошення.

Випереджальне посилання (звернення)

[ред. | ред. код]

Термін «випереджальне посилання» іноді вживаються як синонім попереднього оголошення[1]. Проте найчастіше під випереджальним посиланням (зверненням) мають на увазі фактичне використання сутності до будь-якого оголошення; тобто звернення до second у прикладі вище є випереджувальним посиланням[2]. Таким чином, зважаючи на те, що попереднє оголошення в Паскалі обов'язкове, випереджальні посилання (звернення) в ньому заборонені.

Приклад випереджального посилання в C++:

class C {
public:
  void mutator(int x) { myValue = x; }
  int accessor() { return myValue; }
private:
  int myValue;
};

У цьому прикладі атрибут myValue двічі використано до його оголошення. C++ в цілому забороняє випереджальні звернення. Вони дозволені в особливому випадку: для членів класу. Метод, що змінює атрибут, не може бути скомпільований до того, як компілятору стане відомо про існування myValue. Тому компілятор мусить пам'ятати опис методу, поки він не побачить оголошення myValue.

Обслуговування випереджальних посилань (звернень) може значно підвищити складність і вимоги до пам'яті компілятора. Зазвичай це стає перешкодою для реалізації однопрохідного компілятора.

Див. також

[ред. | ред. код]

Примітки

[ред. | ред. код]