Область видимости (действия) и время жизни переменных

Объекты, объявленные вне процедур, называются внешними, объекты, объявленные внутри процедур и блоков, - внутренними.

Областью видимости (scope) объекта является та часть программы, в пределах которой использование его имени является корректным.

Область видимости имени (определения или описания) внутреннего объекта – это процедура или блок, в которой(ом) находится это определение или описание.

Области видимости внешнего объекта в языках Cи Basic несколько отличаются. В языке Cона распространяется от места его определения до конца файла. Напомним, что в этом языке допустимо определение внешнего объекта между определениями функций. В языке Basic эта область охватывает весь модуль (файл).

Если одно и то же имя объявлено на разных уровнях структуры, то это объявление разных объектов и всегда превалирует более "внутреннее" объявление имени, если мы находимся в его области видимости.

Пример. Приводится на языке C, поскольку он имеет больше уровней структуры. Стрелками с номером показаны области видимости соответствующего объекта по имени a.

#define SIZE 100

float a[SIZE]; _______ /* 1-й объект */

.............. |

| ß 1

void main(void){ |

int a,b; _____| /* 2-й объект */

........ | ß 2

{doublea,c; __| /* 3-й объект */

........... | ß 3

} _|_

........ | ß 2

} /* End main */ ___|


int func1(...){ _______

int k,l; |

........ | ß 1

{char a,e; _____| /* 4-й объект */

......... | ß 4

} __|___

........ | ß 1

} /* End func1 */ |

|

int func2(...){ |

.......... | ß 1

} /* End func2 */ ______|

Объекты, объявленные во внешних уровнях структуры, называются глобальными по отношению к объектам вложенных в них уровней. Области видимости имен называют областями локализации, а соответствующие данные локальными по отношению к области видимости.

Пример.

Первый объект с именем a предыдущего примера глобален по отношению к другим областям локализации, но локален в файле.

Второй объект с именем a глобален для блока, содержащего определение третьего объекта с именем a, но локален в функции main.

Третий объект с именем a локален в блоке.

В языке Cфайл может содержать одни объявления, которые затем могут быть включены в нужные места программы с помощью директивы препроцессора #include.

Рекомендация. Если в программе используются сложные структуры, то их тип разумно описать с помощью инструкции typedef и объединить в один .hфайл.

Кроме области видимости объекты программы обладают временем жизни (lifetime). Время жизни – это период времени, в течение которого объекту выделяется память. Для внешних объектов память резервируется на все время выполнения приложения. Внутренние объекты в большинстве случаев существуют (имеют выделенную память) только при выполнении процедуры или блока, в которой(ом) они определены. Обычно после завершения работы процедуры или блока отведенная им память освобождается.

И в языке C, и в языке Basic есть средства, которые управляют областью видимости и временем жизни объектов программы. Механизм управления в них, однако, различен, поэтому рассмотрим эти средства по отдельности.