Extern

Unit2.

Если же функция F объявлена в модуле Unitl не заголовочном файле, а в фай-

ле реализации, то единственный способ использовать ее в модуле Unit2 — повто-

рить в нем объявление функции.

Если вы хотите предотвратить возможность обращения к функции из другого

модуля, ее надо объявить со спецификацией static. Например:

static void F(void);

Справочные данные по языку C++ 63

Подведем некоторые итоги проведенного рассмотрения проблем видимости пе-

ременных и функций.

• Переменные, объявленные в заголовочном файле модуля или в файле его реа-

лизации вне описания класса и функций, являются глобальными. Они доступ-

ны везде внутри данного модуля. Для доступа к ним из внешних модулей

в этих модулях должно быть повторено их объявление (без инициализации)

с добавлением спецификации extern.

• Функции, объявленные в заголовочном файле модуля вне описания класса,

являются глобальными. Они доступны везде внутри данного модуля. Для до-

ступа к ним из внешних модулей в этих модулях или надо повторить их объяв-

ление, или включить директивой #include заголовочный файл того модуля,

в котором функции описаны.

• Функции, объявленные в файле реализации модуля, являются глобальными.

Они доступны везде внутри данного модуля. Для доступа к ним из внешних

модулей в этих модулях надо повторить их объявление.

• Элементы (переменные и функции), объявленные в классе в разделе private,

видимы и доступны только внутри данного модуля. При этом из функций,

объявленных внутри класса, к ним можно обращаться непосредственно по

имени, а из других функций — только со ссылкой на объект данного класса.

Если в модуле описано несколькоклассов, то объекты этих классов взаимно

видят элементы, описанные в их разделах private.

• Элементы, объявленные в классе в разделе public, видимы и доступны для

объектов любых классов и для других модулей, в которых директивой #include

включен заголовочный файл данного модуля. При этом из объектов того же

класса, к ним можно обращаться непосредственно по имени, а из других объ-

ектов и процедур — только со ссылкой на объект данного класса.

• В классах, помимо обсуждавшихся ранее, могут быть еще разделы protected

— защищенные. Элементы, объявленные в классе в разделе protected, ви-

димы и доступны для любых объектов внутри данного модуля, а также для

объектов классов — наследников данного класса в других модулях. Объекты

из других модулей, классы которых не являются наследниками данного клас-

са, защищенных элементов не видят.

• Элементы, объявленные внутри функции или блока, являются локальными,

т.е. они видимы и доступны только внутри данной функции или данного бло-

ка. При этом время жизни переменных, объявленных внутри функции или

блока, определяется временем активности данного блока. Сделать локаль-

ную переменную существующей постоянно можно с помощью спецификации

static.

• Переменные и функции, объявленные в головном файле проекта, являются

глобальными для этого файла. Если требуется доступ к ним из других моду-

лей, то для функций в них должны быть повторены их объявления, а для пе-

ременных — повторено объявление (без инициализации) со спецификацией

• Если во внутреннем блоке объявлена переменная с тем же именем, что во

внешнем блоке, или с тем же именем, что и глобальная переменная, то соот-

ветствующая внешняя или глобальная переменная в блоке не видна. В этом

случае подучить доступ к одноименной глобальной переменной можно только

с помощью унарной операции разрешения области действия "::".


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: