Здесь мы рассмотрим правила использования модулей.
Для того, чтобы получить доступ к интерфейсным объектам модуля, необходимо указать в программе
имя нужного Tpu-файла. Соответствующая конструкция называется спецификацией используемых модулей
и имеет следующий общий вид:
Uses <имена подключаемых модулей>; .
Эта спецификация должна идти непосредственно после заголовка программы; если некоторый модуль использует объекты другого модуля, то такая спецификация должна следовать сразу после служебного слова Interface или Implementation.
В этом случае все описания из интерфейсной части подключенного модуля считаются известными. К интерфейсным объектам модуля можно обращаться в программе точно так же, как если бы они были описаны в самой этой программе.
Необходимо особо отметить следующие важные моменты, связанные с использованием модулей.
1. Может случиться так, что идентификаторы интерфейсной части используемого модуля
частично пересекаются с идентификаторами использующей программы. В этом случае действует
следующее правило видимости имен: интерфейсные идентификаторы модуля, указанного
первым в uses-списке, образуют самый внешний блок программы; интерфейсные идентификаторы
второго модуля образуют блок, вложенный в первый блок, и т.д. Если, например,
в программе имеется спецификация вида:
Uses A, B; ,
то идентификаторы внешнего блока программы будут "экранировать" (закрывать) одноименные идентификаторы модулей А и В; аналогично, идентификаторы модуля B будут перекрыты одноименными идентификаторами модуля A.
Однако, существует возможность доступа к интерфейсу используемого модуля, несмотря
на наличие в программе одноименных идентификаторов. Пусть имеется следующий модуль:
Unit A;
Interface
Var X : Real;
Implementation
. . .
End.
Далее, пусть программа, использующая этот модуль, также содержит переменную Х:
Program P;
Uses A;
Var X : Integer;
Begin
. . .
End.
Для того чтобы в программе Р иметь доступ к интерфейсной переменной Х из модуля А, необходимо создать составное имя, структура которого похожа на доступ к полям записи: А.Х. Здесь А - имя модуля, Х - идентификатор его интерфейсной переменной. В этом случае конфликт имен снимается, так как, простое указание имени Х будет означать обращение к соответствующей переменной из программы Р, например: A.X:=Round(X);.
2. Возможны случаи косвенных использований. Например, пусть имеются два модуля:
Unit A; Unit B;
Interface Interface
. . . Uses A;
End. . . .
End.
Если некоторая программа использует модуль В, то в соответствующей спецификации
использования необходимо указать только модули, непосредственно
используемые в программе. В данном примере достаточной является следующая спецификация:
Program P;
Uses B;
. . .
End.
3. Недопустимо явное или косвенное обращение модуля к самому себе. Так например, следующие отношения являются ошибочными:
Unit A; Unit B;
Interface Interface
Uses B; Uses A;
. . . . . .
End. End.
4. Если в модуле имеется раздел инициализации, то операторы из этого раздела будут выполнены перед началом выполнения программы, в которой используется данный модуль. Если программа использует несколько модулей, то их разделы инициализации будут выполнены в том же порядке, в котором эти модули перечислены в спецификации использования.
Мы закончили рассмотрение правил использования модулей.
Следующий шаг посвящен организации поиска модулей и описанию системного модуля Turbo.tpl.