Шаг 64.
Использование модулей

    Здесь мы рассмотрим правила использования модулей.

    Для того, чтобы получить доступ к интерфейсным объектам модуля, необходимо указать в программе имя нужного 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.


Предыдущий шаг Содержание Следующий шаг