Unit2.
Если же функция F объявлена в модуле Unitl не заголовочном файле, а в фай-
ле реализации, то единственный способ использовать ее в модуле Unit2 — повто-
рить в нем объявление функции.
Если вы хотите предотвратить возможность обращения к функции из другого
модуля, ее надо объявить со спецификацией static. Например:
static void F(void);
Справочные данные по языку C++ 63
Подведем некоторые итоги проведенного рассмотрения проблем видимости пе-
ременных и функций.
• Переменные, объявленные в заголовочном файле модуля или в файле его реа-
лизации вне описания класса и функций, являются глобальными. Они доступ-
ны везде внутри данного модуля. Для доступа к ним из внешних модулей
в этих модулях должно быть повторено их объявление (без инициализации)
с добавлением спецификации extern.
• Функции, объявленные в заголовочном файле модуля вне описания класса,
являются глобальными. Они доступны везде внутри данного модуля. Для до-
ступа к ним из внешних модулей в этих модулях или надо повторить их объяв-
ление, или включить директивой #include заголовочный файл того модуля,
в котором функции описаны.
• Функции, объявленные в файле реализации модуля, являются глобальными.
Они доступны везде внутри данного модуля. Для доступа к ним из внешних
модулей в этих модулях надо повторить их объявление.
• Элементы (переменные и функции), объявленные в классе в разделе private,
видимы и доступны только внутри данного модуля. При этом из функций,
объявленных внутри класса, к ним можно обращаться непосредственно по
имени, а из других функций — только со ссылкой на объект данного класса.
Если в модуле описано несколькоклассов, то объекты этих классов взаимно
видят элементы, описанные в их разделах private.
• Элементы, объявленные в классе в разделе public, видимы и доступны для
объектов любых классов и для других модулей, в которых директивой #include
включен заголовочный файл данного модуля. При этом из объектов того же
класса, к ним можно обращаться непосредственно по имени, а из других объ-
ектов и процедур — только со ссылкой на объект данного класса.
• В классах, помимо обсуждавшихся ранее, могут быть еще разделы protected
— защищенные. Элементы, объявленные в классе в разделе protected, ви-
димы и доступны для любых объектов внутри данного модуля, а также для
объектов классов — наследников данного класса в других модулях. Объекты
из других модулей, классы которых не являются наследниками данного клас-
са, защищенных элементов не видят.
• Элементы, объявленные внутри функции или блока, являются локальными,
т.е. они видимы и доступны только внутри данной функции или данного бло-
ка. При этом время жизни переменных, объявленных внутри функции или
блока, определяется временем активности данного блока. Сделать локаль-
ную переменную существующей постоянно можно с помощью спецификации
static.
• Переменные и функции, объявленные в головном файле проекта, являются
глобальными для этого файла. Если требуется доступ к ним из других моду-
лей, то для функций в них должны быть повторены их объявления, а для пе-
ременных — повторено объявление (без инициализации) со спецификацией
• Если во внутреннем блоке объявлена переменная с тем же именем, что во
внешнем блоке, или с тем же именем, что и глобальная переменная, то соот-
ветствующая внешняя или глобальная переменная в блоке не видна. В этом
случае подучить доступ к одноименной глобальной переменной можно только
с помощью унарной операции разрешения области действия "::".