Глава 1
Подчеркнем, что таким образом можно получить доступ только к одноимен-
ной глобальной переменной, а не к локальной переменной, описанной во внешнем
блоке.
Единственными идентификаторами с областью действия прототип функции
являются те, которые используются в списке параметров прототипа функции (см.
разд. 1.7.1). Прототипы функций не требуют имен в списке параметров — требу-
ются только типы. Если в списке параметров прототипа функции используется
имя, компилятор это имя игнорирует. Идентификаторы, используемые в прототи-
пе функции, можно повторно использовать где угодно в программе, не опасаясь
двусмысленности.
Теперь остановимся на проблемах видимости переменных в приложениях,
имеющих несколько модулей. Пусть вы имеете два модуля — Unitl и Unit2 и хо-
тите в модуле Unit2 видеть и использовать переменные и функции, объявленные
в модуле Unitl. Вы можете в модуле Unit2 видеть те переменные, которые являют-
ся глобальными в модуле Unitl, т.е. объявлены вне каких-нибудь функций в заго-
|
|
ловочном файле модуля или в его файле реализации. Но для того, чтобы это было
возможно, вы должны повторно объявить их (без инициализации) в модуле Unit2
со спецификацией extern. Например, если в модуле Unitl имеется объявление гло-
бальной переменной
int al = 10;
то в модуле Unit2 вы можете использовать эту переменную, если запишете объяв-
ление
extern int al;•
Причем, это не зависит от того, включили ли вы директивой #include заголо-
вочный файл Unitl.h в модуль Unit2, или нет.
Отметим еще одну особенность использования переменных, описанных в дру-
гом модуле. Если в заголовочном модуле Unitl объявлена описанная выше пере-
менная al, а в модуле Unit2 вы включили директивой #include заголовочный
файл Unitl.h, но не записали объявление этой переменной со спецификацией
extern (вообще не дали объявление al), то в модуле Unit2 будет создана копия пе-
ременной al, инициализированная согласно объявлению в Unitl. Но это будет ко-
пия, совершенно изолированная от переменной al в модуле Unitl. В модулях
Unitl и Unit2 будут существовать две различные переменные с одним именем al.
И изменение одной из них никак не скажется на значении другой.
Все сказанное относится только к глобальным переменным.Локальные пере-
менные, объявляемые внутри функций, невозможно видеть в другом модуле.
Теперь рассмотрим видимость функций в приложениях, имеющих несколько
модулей. Если в модуле Unitl в еш заголовочном файле вне описания класса вы
объявили некоторую функцию F, то в другом модуле Unit2 вы можете использо-
вать ее при выполнении одного из двух условий:
• вы включаете директивой #include в модуль Unit2 заголовочный файл
• вы повторяете в модуле Unit2 (в заголовочном файле или файле реализации)
объявление функции F
В обоих случаях вы сможете вызвать функцию F из любого места модуля