Язык:
Русский
English
Правила области видимости
Присутствие идентификатора или метки в объявлении определяет идентификатор или метку, и каждый раз, когда в тексте программы встречается идентификатор или метка, они должны быть внутри области видимости этого объявления.
Область видимости идентификатора или метки начинается с её объявления и заканчивается в конце текущего блока, включая все блоки, содержащиеся в текущем. Кроме того, область видимости простирается на все потомки объектных типов, включая указатели полей и на операторы, которые работают со ссылками на переменные данного объектного типа.
Исключения
1. Переопределение во внутреннем блоке: Предположим, что ВНЕШНИЙ - это блок, который содержит другой блок, ВНУТРЕННИЙ.
Если ВНЕШНИЙ и ВНУТРЕННИЙ блоки оба имеют идентификатор с одним и тем же именем (например, J), то ВНУТРЕННИЙ может обращаться только к тому J, который был объявлен во ВНУТРЕННЕМ, а ВНЕШНИЙ может обращаться только к тому J, который был объявлен во ВНЕШНЕМ.
2. Позиция объявления внутри блока: Идентификаторы и метки не могут использоваться, пока они не объявлены.
Объявление идентификатора или метки должны быть перед любым вхождением этого идентификатора или метки в текст программы, если это не исходный тип указателя, который еще не был объявлен. Однако, идентификатор должен быть в конечном счете объявлен в том же самом разделе описаний типов, в котором присутствует тип указателя.
3. Переопределение внутри блока: идентификатор или метка могут быть объявлены только один раз во внешнем блоке, если они не объявляются внутри внутреннего блока или не находятся в списке полей записи.
Идентификатор поля записи объявляется внутри типа записи, и значителен только в комбинации со ссылкой на переменную этого типа записи.
Вы можете повторно объявлять идентификатор поля внутри того же самого блока, но не на том же самом уровне внутри того же самого типа записи.
Однако идентификатор, который был объявлен, может быть повторно объявлен как идентификатор поля в том же самом блоке.
4. Идентификатор компонента объекта: область видимости идентификатора компонента объекта простирается на идентификатор объектного типа и всех потомков и блоков всех объявлений метода объектного типа.
Ада
Не нужно предварительно объявлять метки (да и невозможно). Чтобы объявить указатель на ещё не объявленный тип, нужно сперва написать отложенное объявление:
type Cell; -- отложенное объявление типа
type Link is access Cell;
type Cell is record -- полное объявление
Value : Integer;
Succ, Pred : Link;
end record;
В простейших случаях вроде этого можно писать
type Cell is record
Value : Integer;
Succ, Pred : access Cell;
end record;
Если во ВНУТРЕННЕМ и ВНЕШНЕМ блоках объявляются процедуры (или функции), и эти процедуры имеют разные заголовки, то во ВНУТРЕННЕМ блоке они обе доступны и перегружают друг друга.