16.2 Модули

Вверх  Предыдущий  Следующий

Модуль содержит набор объявлений, процедур и функций, которые могут использоваться программой или другим модулем. Синтаксис модуля выглядит следующим образом:


Модули

1602


Как видно из синтаксической диаграммы, модуль всегда состоит из частей interface (интерфейса) и implementation (реализации). И необязательных блоков initialization (инициализации) и finalization (финализации), содержащие код, выполняющийся соответственно при запуске программы, и при её остановке.

Оба части интерфейса и реализации могут быть пустыми, но должны быть указаны ключевыми словами interface и implementation. Ниже приводится правильное определение модуля;

unit a;

 

interface

 

implementation

 

end.

Интерфейсная часть объявляет все идентификаторы (имена), экспортируемые из модуля. Они могут быть объявлением константы, типы, переменные, процедуры и функции. Интерфейсная часть не может содержать исполняемый код: допускается только объявления. Ниже приведена правильная интерфейсная часть:

unit a;

 

interface

 

uses b;

 

Function MyFunction:SomeBType;

 

Implementation

Тип SomeBType определяется в модуле b.

Все функции и методы, объявленные в интерфейсной части, должны быть реализованы в части реализации модуля, за исключением объявленных внешних функций или процедур. Если объявленный метод или функция не реализована, компилятор выдаст сообщение об ошибке, например:

unit unita;

 

interface

 

Function MyFunction:Integer;

 

implementation

 

end.

Приведет к следующей ошибке:

unita.pp (5,10)Error:Forward declaration not solved "MyFunction:SmallInt;"

unita.pp (5,10) Ошибка: Предварительная декларация не реализована "MyFunction:SmallInt;"

Часть реализации в основном предназначена для реализации процедур и функций объявленных в интерфейсной части. Тем не менее, она тоже может содержать собственные объявления: объявленные внутри части реализации не доступны за пределами модуля.

Части initialization (инициализации) и finalization (финализации) модуля не обязательны.

Блок инициализации используется для инициализации некоторых переменных или выполнения кода, необходимый для правильного функционирования модуля. Части инициализации модулей выполняются в порядке, в котором компилятор применяет модули при компиляции программы. Они выполняются до первого оператора программы.

Части финализации модулей выполняются в порядке обратном порядку инициализации. Они используются для очистки ресурсов, выделенных в части инициализации модуля, или в процессе работы программы. Часть финализации всегда выполняется в случае нормального завершения программы: независимо от того что в коде программы достигается окончательное end, или потому, что была где-то выполнена инструкция Halt.

Если программа останавливается во время выполнения блоков инициализации одного из модулей, будут завершены только модули, которые уже были инициализированы. В отличии от Delphi, в Free Pascal блок finalization может присутствовать без блока initialization. Это означает, что следующий код будет скомпилирован во Free Pascal, но не в Delphi.

Finalization

CleanupUnit;

end.

Раздел инициализации сам по себе (то есть без доработки) можно заменить блоком операторов. То есть, следующее:

Initialization

InitializeUnit;

end.

полностью эквивалентно

Begin

InitializeUnit;

end.