Читайте также:
|
|
В Паскале определены 3 режима компиляции:
· Compile
· Make
· Build.
При компиляции модуля или программы в режиме Compile все модули, которые они используют, должны быть откомпилированы, и храниться как машинный код с расширением .tpu, а не исходный текст на Паскале. При этом компилятор Паскаля предполагает, что pas -файл, в котором находится исходный текст модуля, а, следовательно, и соответствующий tpu -файл, имеет такое же имя (как в заголовке Unit). Если имя модуля, например, MyUtilit, то компилятор будет искать файл MyUtilit. pas. Это предположение можно отменить с помощью директивы компилятора U. Пусть, например, в программе используются модули Dos, Crt и MyUtilit, который хранится в модуле Util. pas. Тогда следует использовать следующее предложение Uses:
Uses Dos, Crt, {$U Util. pas} MyUtilit;
При компиляции режиме Make компилятор проверяет наличие tpu -файлов для каждого объявленного модуля. Если какой-либо из файлов не обнаружен, компилятор пытается отыскать соответствующий pas -файл, и, если исходный файл найден, приступает к его компиляции. Кроме того, в этом режиме, если в исходный текст используемого модуля были внесены изменения, то модуль будет перекомпилирован.
В режиме Build существующие tpu -файлы игнорируются, и компилятор пытается отыскать и компилировать соответствующий pas -файл для каждого объявленного в разделе Uses модуля.
Модуль может находиться в отдельном файле с расширением .tpu, а также его можно переслать в библиотеку модулей — в файл с расширением .tpl.
Для использования модуля применяется предложение Uses. Когда компилятор встречает предложение Uses, он прибавляет информацию из секции интерфейса каждого модуля к таблице символов программы и присоединяет машинный код из секции реализации к самой программе. Модули присоединяются в указанном порядке, т.е. в списке предложения Uses модуль должен быть указан после всех модулей, которые он использует.
Ссылки на описания модуля
Как только модуль включен в программу, все его описания из секции интерфейса становятся доступными для программы. Пусть, например, имеется модуль со следующей секцией интерфейса:
Unit MyUnit;
Interface
Const
MyValue = 915;
Type
MyStars = (Deneb, Antares, Betelgeuse);
Var
MyWord: String [20];
Procedure SetMyWord (Star: MyStars);
Function TheAnswer: Integer;
Можно написать следующую программу:
Program TestProg;
Uses
MyUnit;
Var
i: Integer;
AStar: MyStars;
Begin
WriteLn (MyValue);
AStar: = Deneb;
SetMyWord (AStar);
...
WriteLn (MyWord);
i: = TheAnswer;
WriteLn (i)
End.
В программе, использующей модуль, некоторые идентификаторы могут быть переопределены. В этом случае программа будет использовать собственные определения, т.к. они описаны позже, чем определения в модуле. Однако и в этой ситуации можно ссылаться на идентификаторы из модуля, используя составные идентификаторы:
Program TestProg1;
Uses MyUnit;
Const
MyValue = 22; { переопределение для MyValue }
Var i: Integer;
AStar: MyStars;
Function TheAnswer: Integer; { переопределение для функции TheAnswer }
Begin
TheAnswer: = 1
End;
Begin
WriteLn (MyValue); { из программы }
WriteLn (MyUnit. MyValue); { из модуля }
AStar: = Deneb;
SetMyWord (AStar);
...
WriteLn (MyWord);
i: = TheAnswer; { из программы }
WriteLn (i);
i: = MyUnit. TheAnswer; { из модуля }
WriteLn (i)
End.
Дата добавления: 2015-02-16; просмотров: 113 | Поможем написать вашу работу | Нарушение авторских прав |