16.2 Модули |
Вверх Предыдущий Следующий |
Модуль содержит набор объявлений, процедур и функций, которые могут использоваться программой или другим модулем. Синтаксис модуля выглядит следующим образом: Модули Как видно из синтаксической диаграммы, модуль всегда состоит из частей 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. |