Spec-Zone.ru › Ada 95
Справочник Ada 95

8.3 Видимость

Правила видимости, приведённые ниже, определяют, какие объявления видимы и непосредственно видимы в каждой точке программы. Правила видимости применяются к явным и неявным объявлениям.

Статические семантики

Объявление определено как непосредственно видимое в местах, где имя, состоящее только из идентификатора или операторного символа, достаточно для обозначения объявления; то есть, не требуется обозначение через запись выбранного компонента или специальный контекст (например, предшествующее => в именованной ассоциации) для обозначения объявления. Объявление определено как видимое там, где оно непосредственно видимо, а также в других местах, где некоторое имя (например, выбранный компонент) может обозначать объявление.
Синтаксическая категория direct_name используется для обозначения контекстов, где требуется непосредственная видимость. Синтаксическая категория selector_name используется для обозначения контекстов, где требуется видимость, но не непосредственная видимость.
Существуют два вида непосредственной видимости: непосредственная видимость и видимость через использование. Объявление непосредственно видимо в месте, если оно непосредственно видимо, потому что место находится в его непосредственной области видимости. Объявление видимо через использование, если оно непосредственно видимо из-за use_clause (см. 8.4). Оба условия могут применяться.
Объявление может быть скрыто, либо от непосредственной видимости, либо от всей видимости, в определённых частях своей области видимости. Где скрыто от всей видимости, оно вообще не видно (ни с помощью direct_name, ни с помощью selector_name). Где скрыто от непосредственной видимости, теряется только непосредственная видимость; видимость с помощью selector_name всё ещё возможна.
Два или более объявления перегружены, если у них все одинаковое имя определения, и есть место, где все они непосредственно видны.
Объявления вызываемых сущностей (включая литералы перечислений) могут быть перегружены, что означает, что перегрузка для них разрешена.
Два объявления являются омографами, если они имеют одинаковое имя определения, и, если оба могут быть перегружены, их профили соответствуют типу. Внутреннее объявление скрывает любой внешний омограф от непосредственной видимости.
Два омографа обычно не допускаются непосредственно в той же декларативной области, если один не переопределяет другой (см. Правила законности ниже). Единственные объявления, которые могут быть переопределены, - это неявные объявления предопределённых операторов и унаследованных примитивных подпрограмм. Объявление переопределяет другой омограф, который встречается непосредственно в той же декларативной области в следующих случаях:
  • Объявление, которое не может быть переопределено, переопределяет то, которое может быть переопределено, независимо от того, какое объявление встречается первым;
  • Неявное объявление унаследованного оператора переопределяет предопределённый оператор;
  • Неявное объявление унаследованной подпрограммы переопределяет предыдущее неявное объявление унаследованной подпрограммы.
  • Для неявного объявления примитивной подпрограммы в генерическом блоке существует копия этого объявления в экземпляре. Однако для каждого типа, объявленного во видимой части экземпляра, неявно объявляется новый набор примитивных подпрограмм. Эти новые объявления происходят непосредственно после объявления типа и переопределяют скопированные. Скопированные могут вызываться только изнутри экземпляра; новые могут вызываться только извне экземпляра, хотя для помеченных типов тело нового может быть выполнено вызовом старого.
Объявление видимо в своей области видимости, за исключением случаев, когда оно скрыто от всей видимости, следующим образом:
  • Переопределённое объявление скрыто от всей видимости в области видимости переопределяющего объявления.
  • Объявление скрыто от всей видимости до конца объявления, за исключением:
  • Для типа записи или расширения записи, объявление скрыто от всей видимости только до служебного слова record;
  • Для объявления пакета, объявления задачи, объявления защищённого блока, объявления генерического пакета или тела подпрограммы, объявление скрыто от всей видимости только до служебного слова is объявления.
  • Если завершение объявления является объявлением, то в области видимости завершения первое объявление скрыто от всей видимости. Аналогично, спецификация дискриминанта или спецификация параметра скрыта в области видимости соответствующей спецификации дискриминанта или спецификации параметра соответствующего завершения или соответствующего оператора accept.
  • Объявление блока библиотеки (включая объявление переименования блока библиотеки) скрыто от всей видимости, за исключением мест, которые находятся в его декларативной области или в области видимости with_clause, который упоминает его. Для каждого объявления или переименования генерического блока как потомка какого-либо родительского генерического пакета существует соответствующее вложенное объявление непосредственно внутри каждого экземпляра родительского. Такое вложенное объявление скрыто от всей видимости, за исключением мест, которые находятся в области видимости with_clause, который упоминает потомка.
Объявление с defining_identifier или defining_operator_symbol непосредственно видимо (и, следовательно, непосредственно видимо) в своей непосредственной области видимости, за исключением случаев, когда оно скрыто от непосредственной видимости, следующим образом:
  • Объявление скрыто от непосредственной видимости в непосредственной области видимости омографа объявления, если омограф находится во внутренней декларативной области;
  • Объявление также скрыто от непосредственной видимости, если скрыто от всей видимости.

Правила разрешения имён

direct_name должен быть разрешён для обозначения непосредственно видимого объявления, имя определения которого совпадает с direct_name. selector_name должен быть разрешён для обозначения видимого объявления, имя определения которого совпадает с selector_name.
Эти правила видимости и непосредственной видимости не применяются в context_clause, parent_unit_name или pragma, которые появляются в месте compilation_unit. Для этих контекстов см. правила в 10.1.6, «Правила видимости на уровне среды».

Правила законности

Непереопределяемое объявление является недопустимым, если есть омограф, который встречается непосредственно в той же декларативной области, видимый в месте объявления и не скрытый от всей видимости непереопределяемым объявлением. Кроме того, расширение типа является недопустимым, если где-либо в его непосредственной области видимости есть два видимых компонента с одинаковым именем. Аналогично, context_clause для subunit недопустим, если он упоминает (в with_clause) какой-либо блок библиотеки, и есть омограф этого блока библиотеки, видимый в месте соответствующего заглушки, и омограф, и упомянутый блок библиотеки объявлены непосредственно в той же декларативной области. Эти правила также применяются к операциям диспетчеризации, объявленным в видимой части экземпляра генерического блока. Однако они не применяются к другим перегружаемым объявлениям в экземпляре; такие объявления могут иметь соответствующие профили типов в экземпляре, при условии, что соответствующие объявления в генерике не имели соответствующих профилей типов.
ПРИМЕЧАНИЯ
5 Видимость для блоков компиляции следует из определения среды в 10.1.4, за исключением того, что для получения видимости блока library_unit_declaration или library_unit_renaming_declaration необходимо применить with_clause.
6 В дополнение к правилам видимости, приведённым выше, смысл появления direct_name или selector_name в данной точке текста может зависеть от правил перегрузки (см. 8.6).
7 Не все контексты, где разрешены идентификатор, литерал символа или операторный символ, требуют видимости соответствующего объявления. Контексты, где видимость не требуется, идентифицируются путём непосредственного использования этих трёх синтаксических категорий в правиле синтаксиса, а не путём использования direct_name или selector_name.


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API