ПРИЛОЖЕНИЕ 2 Ключи и директивы компилятора
Директивы компилятора Турбо Паскаля управляют режимами компиляции программ в выполнимый код (в памяти или на диске). Они представляют собой комментарии со специальным синтаксисом. Турбо Паскаль допускает директивы компилятора везде, где допускаются комментарии.
Директива компилятора начинается со знака «$», стоящего первым после открывающего граничного знака комментария. Непосредственно после знака «$» следует имя (одна или несколько букв), которое определяет конкретные директивы. Имеются три типа директив:
1. Ключи выбора режимов. Включают конкретные режимы компиляции или выключают их с помощью указания знаков «+» или «-» сразу после имени ключа.
2. Директивы с параметрами. Задают параметры, оказывающие влияние на компиляцию, например имена включаемых файлов и размеры памяти.
3. Директивы (ключи) условной компиляции. Используются для управления порядком компиляции частей исходного текста, основанной на определении пользователем условных символов.
Все директивы за исключением директив переключения должны иметь, по крайней мере, один пробел между именем директивы и параметром.
Директивы компилятора можно разместить непосредственно в исходном коде программы. Можно также изменить применяемые по умолчанию директивы с помощью компилятора, использующего командную строку (ТРС.ЕХЕ) или с помощью компилятора, работающего в диалоговой среде (TURBO.EXE). Все директивы компилятора можно задавать с помощью меню выбора режимов компиляции (Options/Compiler Menu). Все вносимые в меню изменения будут иметь силу при последующих компиляциях. При использовании компилятора ТРС.ЕХЕ директивы компилятора можно либо задавать в командной строке (например, ТРС /$R+ ИмяПрограммы), либо поместить их в файл конфигурации TPC.CFG. Директивы компилятора, которые содержатся в исходном тексте программы, всегда отменяют принятые по умолчанию значения директив.
Эквивалент меню: Option/Compiler/Align Data
Ключ $А позволяет переключаться между выравниванием переменных и
- 541 -
типизированных констант по границе слова и по границе байта. Для процессора 8088 выравнивание на границу слова игнорируется, однако для всех процессоров 80X86 такое выравнивание означает более быстрое выполнение, поскольку адресация ко всем элементам, имеющим размер в слово, или четным адресам происходит за один цикл обращения к памяти вместо двух.
В состоянии {$А+} все переменные и типизированные константы, превышающие по размеру один байт, выравниваются по границе машинного слова (адреса с четными значениями). В случае необходимости между переменными для достижения выравнивания по границе слова включаются дополнительные неиспользуемые байты. Ключ {$А+} не влияет ни на переменные размером в байт, ни на поля структур или элементы массивов. Поле записи будет выравниваться по границе слова только в том случае, если общий размер всех следующих перед ним полей будет иметь четное значение. Аналогично, для любого элемента массива выравнивание по границе слова будет иметь место только, когда размер элементов имеет четное значение.
В состоянии {$А-} никаких действий по выравниванию не предпринимается. Переменные и типизированные константы независимо от их размера помещаются в этом случае просто по следующему доступному адресу.
Независимо от режима $А каждое описание VAR и CONST всегда начинается на границе слова. Подобным образом компилятор всегда старается поддерживать указатель стека (SPtr) выравненным по границе слова, для чего в случае необходимости выделяется дополнительный неиспользуемым байт.
Эквивалент меню: Options/Compiler/Local Symbols
Ключ приводит в действие или отменяет генерацию информации о локальных символах. Информация о локальных символах состоит из имен и типов всех локальных переменных и констант данного модуля, т. е. из символов в секции реализации модуля и символов, содержащихся в процедурах и функциях этого модуля.
Когда для данного модуля задана генерация информации о локальных символах, встроенный отладчик Турбо Паскаля позволяет проверять и модифицировать локальные переменные модуля. Кроме того, с помощью меню Debug/Calls Stack можно проверять обращения к процедурам и функциям модуля.
При включенных режимах Options/Link/Map-File и Debug/Stand-Alone Debugging отладчик позволяет получить информацию о локальных символах данного модуля, если он компилировался в режиме {SL+}.
Для модулей информация о локальных символах записывается в TPU-файле наряду с объектным кодом модуля. Эта информация увеличивает размер файлов (требуется дополнительное пространство), но на размер и скорость работы выполняемой программы это влияния не оказывает.
Ключ, задающий включение информации о локальных символах, обычно используется вместе с ключом отладочной информации, который позволяет включить или выключить генерацию таблицы номеров строк для отладки. Заметим, что в том случае, если режим генерации отладочной информации выключен ({$D-}), директива $L будет игнорироваться.
Эквивалент меню: Options/Compiler/Stack-Checking
В зависимости от режима приводится в действие или отменяется генерирование кода проверки переполнения стека. При указании {$S+} компилятор генерирует в начале каждой процедуры или функции код, который проверяет, достаточное ли место в стеке выделено для локальных переменных. Если в стеке места недостаточно, то обращение к процедуре или функции, скомпилированное с указанием {$S+}, приводит к завершению работы программы, которая при этом выводит сообщение об ошибке времени выполнения. При указании {$S-} подобное обращение наиболее вероятно приведет к фатальной ошибке системы («зависанию»).
Режим проверки параметров строкового типа
Синтаксис: {$V+} или {$V-}
Режим по умолчанию: {$V+}
Тип: Локальный
Эквивалент меню: Options/Compiler/Var-String Checking
Ключ $V управляет проверкой типа при передаче строк в качестве параметров-переменных. В состоянии {$V+} выполняется строгая проверка типа, при которой требуется, чтобы формальный и фактический параметр имели идентичные строковые типы. В состоянии {$ V-} в качестве фактического параметра допускается использовать любую переменную строкового типа, даже если ее описанная длина не совпадает с длиной соответствующего формального параметра.
Директивы с параметрами
Эквивалент меню: Options/Directories/Object Directories
Данная директива предписывает компилятору скомпоновать указанный файл с компилируемой программой или модулем. Директива $L используется для компоновки кода, написанного на языке ассемблера для подпрограмм, описанных как внешние (external). Указанный файл должен быть перемещаемым объектным файлом в формате INTEL (OBJ-формате). Расширением по умолчанию для параметра «ИмяФайла» является «.OBJ». Если в параметре «ИмяФайла» каталог не указан, то в дополнение к поиску файла в текущем каталоге Турбо Паскаль просматривает каталоги, указанные в меню.
Размеры выделяемой памяти
Синтаксис: {$М Стек, МинимумКучи, МаксимумКучи }
Значения по умолчанию: {$М 16384, 0, 655360}
Тип: Глобальный.
Эквивалент меню: Options/Compiler/Memory Sizes
Данная директива указывает параметры распределения памяти программы. Параметр «Стек» должен быть целым числом в диапазоне от 1024 до 65520, указывающим размер сегмента стека. «МинимумКучи» должно быть числом в диапазоне от 0 до 655360, а «МаксимумКучи» должно быть числом в диапазоне от «МинимумКучи» до 655360. Последние два параметра указывают соответственно минимальные и максимальные размеры динамически распределяемой области памяти.
Директива $М не оказывает влияния при использовании ее в модуле (UNIT).