Область (сфера) действия, связанного с объектом идентификатора
Класс памяти
Атрибуты объектов
Под объектом в данном случае понимается поименованная область памяти (переменная, функция, массив и т.п.). В данном подразделе материал большей частью посвящен переменным хотя многое применимо к другим типам объектов.
Кроме типов для объектов или переменных явно или по умолчанию определяются следующие атрибуты:
– класс памяти;
– область (сфера) действия, связанного с объектом идентификатора (имени);
– область видимости объекта;
– продолжительность существования объекта;
– тип компоновки (связывания).
Класс памяти - свойство объекта размещенного в памяти (переменной), которое определяет продолжительность существования объекта (время жизни), тип компоновки (связывания) и другие атрибуты.
Для явного задания классов памяти используются следующие модификаторы:
1. auto – автоматическая или локальная память. Память под переменную с этим модификатором выделяется в стеке каждый раз при выполнении оператора, содержащего определение переменной. Освобождение памяти происходит при выходе из блока, в котором определена переменная. Время ее жизни — с момента описания до конца блока. Для глобальных переменных (переменных, объявленных вне блока), этот спецификатор не используется, а для локальных он принимается по умолчанию, поэтому задавать его явным образом большого смысла не имеет.
Блок – это последовательность объявлений, определений и операторов, заключенных в фигурные скобки {…}. Выделяют два типа блоков: составной оператор и тело функции.
2. register – регистровая память, аналогично auto, но память выделяется по возможности в регистрах процессора. Если такой возможности у компилятора нет, переменные обрабатываются как auto.
3. static – «статическая» память, внутренний тип компоновки, т.е. переменная доступна только в одном файле проекта, где она определена и статическая продолжительность существования, т.е. переменная существует в течение всего времени выполнения программы. Инициализируется один раз при первом выполнении оператора, содержащего определение переменной.
4. extern – «внешняя» память, внешний тип компоновки, т.е. переменная доступна во многих файлах проекта, и статическая продолжительность существования.
Если класс памяти явно не определен, то для переменных, определенных вне блоков класс памяти – extern, а для определенных внутри блоков – auto.
Область (сфера) действия - часть исходного кода программы, в которой идентификатор может быть использован для доступа к связанному с ним объекту.
Область действия идентификатора определяется следующим образом:
1. Если идентификатор объявлен в блоке: область действия от точки объявления до конца блока. Если блок – тело функции, то в нем определены и указанные в заголовке формальные параметры функции. Из области действия могут исключаться внутренние блоки, если в них данный идентификатор используется повторно.
2. Если идентификатор объявлен вне блока: область действия от точки объявления до конца файла.
Понятие видимости объекта по смыслу близко к понятию области действия. Данное понятие стали выделять отдельно в связи с появление в языке Си++ новой операции «изменение области видимости».
Область видимости объекта - часть исходного кода программы, в которой к объекту можно непосредственно обращаться по его идентификатору.
Чаще всего область видимости совпадает с областью действия, различия появляются, если идентификатор используется повторно внутри внутренних блоков в качестве имени для другого объекта. Такие внутренние блоки выпадают из области видимости внешнего объекта.
Неформально можно записать:
«Область видимости» «≤» «Области действия»
Существует операция изменения области видимости. Ее формат:
::<идентификатор>
Данная операция является унарной и позволяет обращаться к глобальным объектам (переменным) даже если внутри блока данное имя используется для другой переменной.
Пример использования операции:
#include <stdio.h>
int i=1; // Глобальная переменная
void main()
{
int i=2; // Локальная перменнная блока
// Внутри блока глабальная переменная i не видна
printf("i=%d", i); // Печатается i=2
// С помощью операции :: обращаемся к глобальной переменной
printf("\ni=%d", ::i); // Печатаеся i=1
::i=100; // Изменяем значение глобальной переменной