50____________________________________________Глава 1

приведенном выше примере переменная i во внутреннем блоке будет создаваться
каждый раз, когда управление передается в этот блок, ей каждый раз будет при-
сваиваться значение 7 и она каждый раз будет разрушаться при выходе из блока.

Сказанное выше о времени жизни относится к так называемым автоматиче-
ским (auto) переменным и не относится к статическим переменным, объявленным
как static. Например:

static int i = 7;

Такие статические переменные существуют все время работы программы и
инициализируются только один раз. Таким образом, в этих переменных можно на-
капливать какую-то информацию. Например, они могут служить счетчиками чис-
ла обращений к блоку.

Выше говорилось, что если во внутреннем блоке объявлена переменная с тем
же именем, что во внешнем блоке, или с тем же именем, что и глобальная перемен-
ная, то соответствующая внешняя или глобальная переменная в блоке не видна.
Однако, в C++ имеется унарная операция разрешения области действия, позволя-
ющая все-таки во внутреннем блоке обращаться к глобальной переменной с тем же
идентификатором. Операция обозначается двумя символами двоеточия «::». Если
поставить эти символы перед идентификатором переменной, то обращение будет к
глобальной переменной с этим именем. Так в приведенном выше примере во внут-
реннем блоке можно, например записать оператор

i = : : i + 1 ;

Этот оператор присвоит внутренней переменной i значение на .единицу боль-
шее значения глобальной переменной i.

Подчеркнем, что таким образом можно получить доступ только к одноимен-
ной глобальной переменной, а не к локальной переменной, описанной во внешнем
блоке.

Теперь остановимся на проблемах видимости переменных в приложениях,
имеющих несколько модулей. Пусть вы имеете два модуля — Uniti и Unit2 и хо-
тите в модуле Unit2 видеть и использовать переменные и функции, объявленные в
модуле Uniti. Вы можете в модуле Unit2 видеть те переменные, которые являются
глобальными в модуле Uniti, т.е. объявлены вне каких-нибудь 4эункций в заголо-
вочном файле модуля или в его файле реализации. Но для того, чтобы это было
возможно, вы должны повторно объявить их (без инициализации) в модуле Unit2
со спецификацией extern. Например, если в модуле Uniti имеется объявление гло-
бальной переменной

int а1 = 10;

то в модуле Unit2 вы можете использовать эту переменную, если запишете объяв-
ление

extern int al;

Причем, это не зависит от того, включили ли вы директивой #include заголо-
вочный файл Uniti.h в модуль Unit2, или нет.

Отметим еще одну особенность использования переменных, описанных в дру-
гом модуле. Если в'заголовочном модуле Uniti объявлена описанная выше пере-
менная al, а в модуле Unit2 вы включили директивой #include заголовочный
файл Uniti.h, но не записали объявление этой переменной со спецификацией ex-
tern (вообще не дали объявление al), то в модуле Unit2 будет создана копия пере-
менной al, инициализированная согласно объявлению в Uniti. Но это будет ко-
пия, совершенно изолированная от переменной al в модуле Uniti. В модулях
Uniti и Unit2 будут существовать две различные переменные с одним именем al.
И изменение одной из них никак не скажется на значении другой.