Руководство по языку B.Pascal 7

       

Генерация оверлейного кода


Borland Pascal допускает использование модуля в качестве оверлейного только в том случае, если он генерировался с директи- вой {$O+}. Когда задана эта директива, генератор выполняемого ко- да, при передаче строки из одной оверлейной процедуры в другую и задании постоянных параметров, предпринимает особые меры предос- торожности. Например, если модуль UnitA содержит процедуру со следующим заголовком:

procedure WriteStr(s: string);

и модуль UnitB содержит оператор:

WriteStr('Hello word...');

то Borland Pascal помещает строковую константу 'Hello word...' в сегмент кода модуля UnitB и передает указатель на него процедуре WriteStr. Однако, если оба модуля являются оверлейными, то это работать не будет, поскольку при обращении в WriteStr сегмент ко- да модуля UnitB может быть перекрыт модулем UnitA, и ссылка на строку окажется недопустимой. Для того, чтобы избежать эти проб- лемы, используется директива {$O+}. Каждый раз, когда Турбо Пас- каль встречает обращение из одного модуля, скомпилированного с директивой {$O+}, к другому модулю, скомпилированному с директи- вой {$O+}, компилятор перед передачей ссылок на них обеспечивает временное копирование всех размещенных в сегменте кода констант в стек.

Указание в модуле директивы {$O+} не обязывает вас использо- вать этот модуль как оверлейный. Она просто указывает Borland Pascal на необходимость обеспечения, если это нужно, использова- ния данного модуля в качестве оверлейного. Если вы разрабатываете модули, которые планируете использовать как в оверлейных, так и в неоверлейных прикладных программах, то компиляция их с директивой {$O+} обеспечивает использование одной версии модуля для обоих случаев.



Содержание раздела