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+} обеспечивает использование одной версии модуля для обоих
случаев.