Урок №55. Зв’язки, область видимості та тривалість

  Юрій  | 

  Оновл. 10 Тра 2020  | 

 151

Ми вже розглядали в різних уроках область видимості, тривалість, зв’язки і те, якими вони можуть бути. Зараз пора це все закріпити в одному уроці.

Область видимості

Область видимості ідентифікатора визначає, де він доступний для використання. До ідентифікатора, який знаходиться поза областю видимості, — доступ закритий.

   Змінні з локальною областю видимості доступні тільки в межах блоку, в якому вони оголошені. Це:

   локальні змінні;

   параметри функції.

   Змінні з глобальною/файловою областю видимості доступні в будь-якому місці файлу. Це:

   глобальні змінні.

Тривалість

Тривалість змінної визначає, де вона створюється і де знищується.

   Змінні з автоматичною тривалістю створюються в точці визначення і знищуються при виході з блоку, в якому вони визначені. Це:

   звичайні локальні змінні.

   Змінні з статичною тривалістю створюються, коли програма запускається, і знищуються при її завершенні. Це:

   глобальні змінні;

   статичні локальні змінні.

   Змінні з динамічною тривалістю створюються і знищуються по запиту програміста. Це:

   динамічні змінні (про них ми поговоримо трішки пізніше).

Зв’язки

Зв’язок ідентифікатора визначає, чи належать декілька згадок одного ідентифікатора до одного і того ж ідентифікатора чи ні.

   Ідентифікатори без зв’язку — це ідентифікатори, які посилаються самі на себе. Це:

   звичайні локальні змінні;

   користувацькі типи даних, такі як enum, typedef і класи, оголошені всередині блоку (про це детальніше в наступних уроках).

   Ідентифікатори з внутрішнім зв’язком доступні в будь-якому місці файла, в якому вони оголошені. Це:

   статичні глобальні змінні (ініціалізовані чи неініціалізовані);

   константні глобальні змінні;

   статичні функції (про них ми поговоримо пізніше).

   Ідентифікатори з зовнішнім зв’язком доступні як в будь-якому місці файлу, в якому вони оголошені, так і в інших файлах (через попередні оголошення). Це:

   звичайні функції;

   неконстантні глобальні змінні (ініціалізовані чи неініціалізовані);

   зовнішні константні глобальні змінні;

   користувацькі типи даних, такі як enum, typedef і класи з глобальною областю видимості (про них ми поговоримо пізніше).

Ідентифікатори з зовнішнім зв’язком можуть викликати помилку дублювання визначень, якщо визначення будуть скомпільовані в більш ніж один файл .cpp.

Функції мають зовнішній зв’язок за замовчуванням, що можна змінити за допомогою ключового слова static (на внутрішній зв’язок).

Уважні читачі можуть зауважити, що глобальні типи даних мають зовнішній зв’язок, але їх визначення не викликають помилки лінкера при використанні в декількох файлах. Це пов’язано з тим, що типи, шаблони і зовнішні вбудовані функції мають привілей, яка дозволяє їм бути визначеними більш ніж в одному файлі, за умови, що ці визначення ідентичні. В протилежному випадку, вони не були б такі корисні.

Резюмуємо

Весь матеріал вище:

Тип Приклад Область видимості Тривалість Зв’язок Примітка
Локальна змінна int x; Локальна область видимості Автоматична тривалість Немає зв’язку
Статична локальна змінна static int s_x; Локальна область видимості Статична тривалість Немає зв’язку
Динамічна змінна int *x = new int; Локальна область видимості Динамічна тривалість Немає зв’язку
Параметр функції void foo(int x) Локальна область видимості Автоматична тривалість Немає зв’язку
Зовнішня неконстантна глобальна змінна int g_x; Глобальна область видимості Статична тривалість Зовнішній зв’язок Ініціалізована чи неініціалізована
Внутрішня неконстантна глобальна змінна static int g_x; Глобальна область видимості Статична тривалість Внутрішній зв’язок Ініціалізована чи неініціалізована
Внутрішня константна глобальна змінна const int g_x(1); Глобальна область видимості Статична тривалість Внутрішній зв’язок Повинна бути ініціалізована
Зовнішня константна глобальна змінна extern const int g_x(1); Глобальна область видимості Статична тривалість Зовнішній зв’язок Повинна бути ініціалізована

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

За допомогою попереднього оголошення ми можемо отримати доступ до функції або змінної з іншого файлу:

Тип Приклад Примітка
Попереднє оголошення функції void foo(int x); Тільки прототип, без тіла функції
Попереднє оголошення неконстантної глобальної змінної extern int g_x; Повинно бути ініціалізовано
Попереднє оголошення константної глобальної змінної extern const int g_x; Повинно бути ініціалізовано

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (2 оцінок, середня: 5,00 з 5)
Loading...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *