ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

Часть 23

Глава 21. Директивы компилятора
Некоторые из возможностей компилятора Турбо Паскаля реализуются с помощью директив компилятора. Директива компилятора представляет собой комментарий со специальным синтаксисом. Турбо Паскаль допускает директивы компилятора везде, где допускаются коммента
рии.
     Директива компилятора начинается со знака $, стоящего первым после открывающего граничного знака комментария. Непосредственно после знака $ следует имя (одна или несколько букв), которое определяет конкретные директивы. Имеются три типа директив: 
     - Директивы-переключатели. Эти директивы включают конкретные возможности компилятора или выключают их с помощью указания знака плюса "+" или минуса "-" сразу после имени директивы. 
     - Директивы с параметрами. Эти директивы задают параметры, оказывающие влияние на компиляцию, такие, например, как имена файлов и размеры памяти. 
     - Условные директивы. Эти директивы используются для управления условной компиляцией частей исходного текста, основанной на определении пользователем условных идентификаторов. 
     Все директивы, за исключением директив-переключателей, должны иметь крайней мере один пробел между именем директивы и параметром. 
     Ниже приводятся некоторые примеры директив компилятора: 
     {$B+}
     {$R- Turn off range-checking}
     {$I TYPES.INC}
     {$U C:\UNITS\MEM}
     {$M 65520,8192,655360}
     {$DEFINE Debug}
     {$IFDEF Debug}
     {$ENDIF}

     Директивы компилятора вы можете разместить непосредственно в исходном коде программы. Можно также изменить используемые по умолчанию директивы с помощью компилятора, использующего командную строку (TPWC.EXE) или с помощью компилятора, работающего в 
интегрированной интерактивной среде (TPW.EXE). Все директивы компилятора можно задавать с помощью меню выбора параметров компилятора (OptionsіCompiler). Все вносимые вами в меню изменения будут иметь силу при последующих компиляциях. При использовании ко
мандного компилятора директивы компилятора можно либо задавать в командной строке (например, TPWC /$R+ MYPROG), либо поместить их в файл конфигурации (более детальное описание дается в Главе 8 "Руководства пользователя"). Директивы компилятора, которые с
одержатся в исходном коде, всегда отменяют принятые по умолчанию значения директив. Это справедливо как для компилятора, работающего в режиме командной строки, так и для интерактивного компилятора. 
     Если вы работаете в интегрированной среде, используя альтернативный набор команд редактора, и хотите быстро просмотреть, какие действуют директивы компилятора, нажмите Ctrl+O O. Турбо Паскаль поместит текущие установки в вершину окна редактирования.
 
                     Директивы-переключатели

     Директивы-переключатели могут быть глобальными или локальными. Глобальные директивы оказывают влияние на всю компиляцию, тогда как локальные директивы оказывают влияние только на ту часть компиляции, которая происходит, начиная с появления данной ди
рективы до следующего ее обнаружения. 
     Глобальные директивы должны указываться перед разделом описания данной программы или данного программного модуля, подлежащих компиляции, то есть перед первым использованием ключевых слов uses, label, const, type, procedure, function или begin. Локал
ьные директивы могут задаваться в любом месте программы или программного модуля. 
     Несколько директив-переключателей можно сгруппировать в одном комментарии директив компилятора с разделением их запятыми, например: 
     {$B+,R,S-}

     В этом случае пробелы между директивами могут не указываться. 
                       Выравнивание данных

     Синтаксис: {$A+} или {$A-}

     По умолчанию: {$A+}

     Тип: Глобальный.

     Эквивалент меню: OptionіCompilerіWord Align Data (ПараметрыіКомпиляторіВыравнивание данных на границу слова). 
     Данная директива позволяет переключаться между выравниванием переменных и типизованных констант на границу слова и на границу байта. Для процессора 8088 выравнивание на границу слова игнорируется. Однако для всех процессоров 80х86 выравнивание на гр
аницу слова означает более быстрое выполнение, поскольку адресация ко всем элементам, имеющим размер в слово, или четным адресам происходит за один цикл обращения к памяти вместо двух. 
     В состоянии {$A+} все переменные и типизованные константы, превышающие по размеру один байт, выравниваются на границу машинного слова (адреса с четными значениями). В случае необходимости между переменными для достижения выравнивания на границу слов
а включаются дополнительные неиспользуемые байты. Директива {$A+} не влияет ни на переменные размером в байт, ни на поля структур или элементы массивoв. Поле записи будет выравниваться на границу слова только в том случае, если общий размер всех следующи
х перед ним полей будет иметь четное значение. Аналогично, для любого элемента массива выравнивание на границу слова будет иметь место только когда размер элементов имеет четное значение. 
     В состоянии {$A-} никаких действий по выравниванию не предпринимается. Переменные и типизованные константы независимо от их размера помещаются в этом случае просто по следующему доступному адресу. 
     Независимо от директивы $A+ в разделе описаний каждое описание var и const всегда начинается на границе слова. Аналогично, компилятор компилятор всегда старается поддерживать указатель стека (SP) настроенным на границу слова, для чего в случае необх
одимости для стека процедуры выделяется дополнительный неиспользуемый байт. 
                      Булевские вычисления

     Синтаксис: {$B+} или {$B-}

     Значение по умолчанию: {$B+}

     Тип: Локальный.

     Эквивалент меню: OptionsіCompilerіComplete Boolean Evaluation (ПараметрыіКомпиляторіПолные булевские вычисления). 
     Эта директива осуществляет два различных вида генерации кода для булевских операций and и or. 
     В состоянии {$B+} компилятор генерирует код для полного вычисления булевского выражения. Это значит, что каждый операнд булевского выражения, состоящий из операторов and и or, будет вычислен, даже если результат всего выражения заранее известен. 
     В состоянии {$B-} компилятор генерирует код для вычисления булевского выражения по короткой схеме, то есть вычисление прекратится сразу, как станет очевидным результат вычисления всего этого выражения. 
     Более подробно смотрите информацию в Главе 6 в разделе "Булевские операции" . 
                     Информация для отладки

     Синтаксис: {$D+} или {$D-}

     По умолчанию: {$D+}

     Тип: Глобальный.

     Эквивалент меню: OptionsіCompilerіDebug Information (ПараметрыіКомпиляторіИнформация для отладки). 
     Данная директива задает или отменяет генерацию информации для отладке. Отладочная информация состоит из таблицы номеров строк для каждой процедуры, устанавливающей соответствие адресов объектных кодов с номерами строк исходного текста. 
     Для программных модулей отладочная информация записывается в файл .TPU вместе с объектным кодом. Отладочная информация приводит к увеличению размера файлов .TPU и требует дополнительного пространства при компиляции использующей данный модуль програм
мы, но на размер и скорость работы выполняемой программы влияния не оказывает. 
     Директива $D не будет действовать, пока не установите Debug Information (Информация для отладки) в параметре EXE (OptionіLinker) в интегрированной среде или не зададите параметр /V в командной строке при использовании компилятора TPWC.EXE. 
     Если параметр Debug Information установлен для данной программы или модуля, для выполнения этого модуля по шагам или установки в нем точки останова вы можете использовать Турбо отладчик для Windows. 
     Если вы компилируете модуль в состоянии {$D+}, параметр Map File (OptionsіLinker) создает для данного модуля полную информацию о номерах строк. 
     Переключатель отладочной информации обычно $D используется вместе с переключателем локальных символов $L, который позволяет включить или выключить генерацию отладочной информации по локальным символам. 
                       Дальний тип вызова

     Синтаксис: {$F+} или {$F-}

     По умолчанию: {$F-}

     Тип: Локальный.

     Эквивалент меню: OptionіCompilerіForce Far Calls (ПараметрыіКомпиляторіИспользование дальнего типа вызова). 
     Данная директива управляет выбором типа вызова последовательно компилируемых процедур и функций. Процедуры и функции, скомпилированные в состоянии {$F+}, всегда используют дальний тип обращений. При указании директивы {$F-} Турбо Паскаль автоматичес
ки выбирает соответствующий тип обращений: дальний, если процедура или функция описывается в разделе интерфейс программной единицы, и ближний в противном случае. 
     Дальний и ближний тип вызова описываются полностью в Главе 18 "Вопросы управления". 
               Генерация кода для процессора 80286

     Синтаксис: {$G+} или {$G-}

     По умолчанию: {$G-}

     Тип: Локальный.

     Эквивалент меню: OptionіCompilerі286 Instructions (ПараметрыіКомпиляторіИнструкции процессора 80286). 
     Директива $G разрешает или запрещает генерацию кода для процессора 80286. В состоянии {$G-} генерируются только инструкции процессора 8086, и программы, сгенерированные в этом состоянии могут выполняться на любом процессоре серии 80х86. В состоянии 
{$G+} компилятор использует дополнительные инструкции процессора 80286, которые улучшают генерацию кода, но программы, скомпилированные в этом состоянии, не смогут работать на процессорах 8086 или 8088. Эти дополнительные инструкции включают в себя инстр
укции ENTER, LEAVE, PUSH с непосредственным операндом, расширенную инструкцию IMUL и расширенные инструкции SHL и SHR. 
                  Проверка ошибок ввода-вывода

     Синтаксис: {$I+} или {$I-}

     По умолчанию: {$I+}

     Тип: Локальный.

     Эквивалент меню: OptionіCompilerіI/O Checking (ПараметрыіКомпиляторіПроверка ввода-вывода). 
     Данная директива задает или отменяет автоматическую генерацию кода, проверяющего результат обращения к процедуре вводавывода. Процедуры ввода-вывода описываются в Главе 19 ("Вопросы ввода и вывода"). Если процедура ввода-вывода возвращает ненулевой 
результат ввода-вывода при включенном переключателе (+), то программа завершает работу, выводя на экран сообщения об ошибке во время выполнения. Если переключатель выключен (-), то результат операции ввода-вывода нужно проверять с помощью функции OIResul
t. 
             Информация о локальных идентификаторах

     Синтаксис: {$L+} или {$L-}

     По умолчанию: {$L+}

     Тип: Глобальный.

     Эквивалент меню: OptionsіCompilerіLocal Symbols (ПараметрыіКомпиляторіЛокальные идентификаторы). 
     Данная директива приводит в действие или отменяет генерацию информации о локальных идентификаторах. Информация о локальных идентификаторах состоит из имен и типов всех локальных переменных и констант данного модуля, то есть из идентификаторов в секц
ии реализации модуля и идентификаторов, содержащихся в процедурах и функциях этого модуля. 
     Когда для данного модуля задана генерация информации о локальных идентификаторах встроенный отладчик Турбо Паскаля позволяет вам проверять и модифицировать локальные переменные модуля. Кроме того, с помощью меню WindowіCalls Stack window (ОкноіОкно 
стека вызова) можно проверять обращения к процедурам и функциям модуля. 
     Для модулей информация о локальных идентификаторах записывается в файле .TPU наряду с объектным кодом модуля. Эта информация увеличивает размер файлов (требуется дополнительное пространство). Однако на размер и скорость работы выполняемой программы 
это влияния не оказывает. 
     Директива $L не будет действовать, пока не установите Debug Info (Информация для отладки) в параметре EXE (OptionіLinker) в интегрированной среде или не зададите параметр /V в командной строке Турбо Паскаля при использовании компилятора TPWC.EXE. 
     Если параметр генерации информации о локальных идентификаторах установлен для данной программы или модуля, для проверки и моджификации значений локальных переменных этого модуля вы можете использовать Турбо отладчик для Windows. 
     Параметры Map File (OptionsіLinker) и Debug Info (OptionsіLinker) создают для данного модуля информации о локальных идентификаторах только в том случае, если этот модуль компилируется в состоянии {$L+}. 
     Переключатель, задающий включение информации о локальных идентификаторах $L, обычно используется вместе с директивой включения в файл отладочной информации, которая позволяет включить или выключить генерацию таблицы номеров строк для отладки. Замети
м, что в том случае, если переключатель отладочной информации выключен ({$D-}), директива $L будет игнорироваться. 
                      Проверка границ

     Синтаксис: {$R+} или {$R-}

     По умолчанию: {$R-}

     Тип: Локальный.

     Эквивалент меню: OptionsіCompilerіRange-Checking (ПараметрыіКомпиляторіПроверка диапазона) 
     Данный переключатель приводит в действие и отменяет генерацию кода с проверкой границ. При указании директивы {$R+} все выражения с индексированными строками и массивы проверяются на предмет нахождения их внутри указанных границ, а все операторы при
сваивания значений скалярным величинам и переменным поддиапазонов проверяются на нахождение в заданных границах. Если обнаруживается нарушение диапазона, программа завершает свою работу, выводя сообщения об ошибке этапа выполнения. Приведенная в действие
 проверка границ замедляет работу программы и увеличивает ее размер. Используйте эту директиву при отладке, а затем, после получения отлаженной программы, удалите ее. 
     Если директива $R включена, то все обращения к виртуальным методам проверяются на состояние инициализации для экземпляра объекта, выполняющего вызов. Если экземпляр объекта, выполняющий вызов, не инициализирован своим конструктором, то происходит ош
ибка этапа выполнения по нарушению диапазона. 
     Разрешение проверки границ и вызовов виртуальных методов замедляет выполнение ваших программ и несколько увеличивает их размер, поэтому директиву {$R+} следует использовать только для отладки. 
                   Проверка переполнения стека

     Синтаксис: {$S+} или {$S-}

     По умолчанию: {$S+}

     Тип: Локальный.

     Эквивалент меню: OptionsіCompilerіStack Checking (ПараметрыіКомпиляторіПроверка стека). 
     Данная директива приводит в действие или отменяет генерацию кода с проверкой переполнения стека. При указании директивы {$S+} компилятор генерирует в начале каждой процедуры или функции код, который проверяет, достаточное ли место в стеке выделено д
ля локальных переменных. Если в стеке места недостаточно, то обращение к процедуре или функции, скомпилированной с указанием директивы {$S+}, приводит к завершению работы программы, которая при этом выводит сообщение об ошибке времени выполнения. При ука
зании директивы {$S-} такое обращение наиболее вероятно приведет к фатальной ошибке системы. 
         Проверка параметров-переменных строкового типа

     Систаксис: {$V+} или {$V-}

     По умолчанию: {$V+}

     Тип: Локальный.

     Эквивалент меню: (OptionsіCompilerіStrict Var String (ПараметрыіКомпиляторіПроверка строк-переменных). 
     Проверка параметров-переменных строкового типа управляет проверкой типа при передаче строк в качестве параметров-переменных. В состоянии {$V+} выполняется строгая проверка типа, при которой требуется, чтобы формальный и фактический параметр имели ид
ентичные строковые типы (string). В состоянии {$V-} в качестве фактического параметра допускается использовать любую переменную строкового типа, даже если ее описанная длина не совпадает с длиной соответствующего формального параметра. 
                    Кадры стека Windows

     Синтаксис: {$W+} или {$W-}

     По умолчанию: {$W+}

     Тип: Локальный.

     Эквивалент меню: OptionsіCompilerіWindows Stack Frames (Параметры іКомпиляторіКадры стека Windows). 
     Директива $W управляет генерацией специфического для Windows кода входа и выхода для процедур и функций с дальним типом вызова (far). В состоянии {$W+} для процедур и функций far генерируется специальная запись кода и выхода, благодаря чему подсисте
ма управления памятью реального режима Windows может корректно идентифицировать дальние кадры стека при настройкке на цепочки вызова после перемещения сегмента кода или данных. В состоянии {$W-} генерируется дополнительная запись кода или выхода. Если пр
ограмма работает в стандартном режиме Windows или только в улучшенном режиме Windows 386, директиву $W можно запретить (состояние {$W-}). 
                      Расширенный синтаксис

     Синтаксис: {$X+} или {$X-}

     По умолчанию: {$X-}

     Тип: Глобальный.

     Эквивалент меню: OptionsіCompilerіExtended Syntax (ПараметрыіКомпиляторіРасширенный синтаксис). 
     Директива компилятора $X разрешает или запрещает расширенный синтаксис Турбо Паскаля. 
     - Операторы функции. В режиме {$X+} вызовы функций можно использовать, как операторы, то есть результат функции может отбрасываться. В общем случае вычисления, выполняемые функцией, представляются через результат, поэтому в отбрасывании результата с
мысла мало. Однако в определенных случаях функция на основе своих параметров может выполнять много операций. В некоторых из таких случаев результат функции не имеет смысла. В таких ситуациях расширения, допускаемые по директиве {$X+}, позволяют интерпрет
ировать функцию, как процедуру. 
     Примечание: Директива {$X+} не применяется к встроенным функциям (то есть функциям, определенным в модуле System). 
     - Строки, завершающиеся нулем. Директива компилятора {$X+}, активизируя специальные правила, которые применяются к встроенному типу PChar и символьным массивам с нулевой базой, разрешает поддержку Турбо Паскалем строк с завершающим нулем. Подробнее 
об этих строках рассказывается в Главе 13 "Модул Strings". 
                     Директивы с параметрами

     Данные директивы позволяют вам задавать параметры, влияющие на выполнение программы. 
                   Атрибут сегмента кода

     Синтаксис: {$C атрибут атрибут}

     Тип: Глобальный.

     По умолчанию: {$C MOVEABLE PRELOAD PERMANENT}

     Директива $C используется для управления атрибутами сегмента кода. Каждый сегмент кода в прикладной программе или библиотеке имеет набор атрибутов, которые определяют поведение сегмента кода при загрузке в память. Например, вы можете задать, что сег
мент кода является перемещаемым (MOVEABLE). Это означает, что Windows может при необходимости перемещать сегмент кода в памяти. Либо вы можете указать, что сегмент кода фиксированный. Это означает, что расположение сегмента кода в памяти изменяться не мо
жет. 
     Директива $C влияет только на сегмент кода того программного модуля (программы, модуля или библиотеки), в который она помещена. В следующей таблице атрибуты сегмента кода разбиты на пары, где каждый параметр имеет противоположное значение. Это следу
ющие группы: 
     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     MoveAble           Windows может изменять расположение
                        сегмента кода в памяти.

     Fixed              Windows не может изменять
                        расположение сегмента кода в памяти.
     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     Preload            Сегмент кода загружается при
                        выполнении программы.

     DemandLoad         Сегмент кода загружается только при
                        необходимости.
     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     Permanent          После того, как Windows загружает
                        сегмент, он остается в памяти.

     Discardable        Когда сегмент кода больше не нужен,
                        он может выгружаться.
     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Первый атрибут в каждой группе назначается по умолчанию. С помощью директивы $C вы можете задать несколько атрибутов сегментов кода. Если в данной директиве заданы оба атрибута группы, то действовать будет только последний из них. Например, директив
а: 
     {$C Fixed Moveable Discardable}
 приведет к созданию перемещаемого (Moveable) сегмента кода, и когда он больше не требуется, сегмент будет выбрасываться (Discardable). 
                         Описание

     Синтаксис: {$D тектс}

     Тип: Глобальный.

     Директива $D включает в файл EXE или DLL заданный вами текст. Обычно это примечание об авторских правах и номере версии, но вы можете задать любой текст по своему усмотрению, например: 
     {$D My Masterprice version 12.5 (C) Fly By Nite Software, 1991}

                      Включение файла

     Синтаксис: {$I имя_файла}

     Тип: Локальный.

     Данная директива сообщает компилятору о необходимости включить в компиляцию названный файл. Фактически файл вставляется в скомпилированный текст непосредственно за директивой {$I имя_файла}. Расширением по умолчанию для параметра "имя_файла" являетс
я .PAS. Если параметр "имя_файла" не указывает каталога, то в дополнение к поиску файлов в текущем каталоге Турбо Паскаль осуществляет поиск его в каталогах, указанных в меню OptionsіDirectoriesіInclude Directories, или в каталогах, указанных в параметре
 /I командной строки компилятора Паскаля TPWC. 
     Это значит, что для включаемых файлов допускается вложенность на глубину до 15 уровней. 
     Имеется одно ограничение на использование включаемых файлов: включаемый файл не может указываться в середине раздела операторов. Это означает, что все операторы между операторными скобками begin и end раздела операторов должны постоянно находиться в
 одном и том же исходном файле. 
                   Компоновка объектного файла

     Синтаксис: {$L имя_файла }

     Тип: Локальный.

     Данная директива (где "имя_файла" - имя объектного файла) предписывает компилятору скомпоновать указанный файл с компилируемой программой или программным модулем. Директива $L используется для компоновки кода, написанного на языке Ассемблера для под
программ, описанных как внешние (external). Указанный файл должен быть перемещаемым объектным файлом в формате Intel (файл .OBJ). Расширением по умолчанию для параметра "имя_файла" является .OBJ. Если в параметре "имя_файла" каталог не задан, то в дополн
ение к поиску файла в текущем каталоге Турбо Паскаль просматривает каталоги, указанные в меню OptionsіDirectoriesіInclude Directories (ПараметрыіКаталогиіКаталоги включаемых файлов) или в каталогах, указанных в параметре /O командной строки компилятора Т
РWС. 
     Более подробно о компоновке с языком Ассемблера рассказывается в Главе 23 "Компоновка с кодом Ассемблера". 
                    Размеры выделяемой памяти

     Синтаксис: {$M размер_стека, размер_динамической_области}

     По умолчанию: {$M 8192,8192}

     Тип: Глобальный.

     Эквивалент меню: OptionsіMemory Sizes (ПараметрыіРазмеры памяти). 
     Данная директива указывает параметры распределения памяти программы. Параметр "размер_стека" должен быть целым числом в диапазоне от 1024 до 65520, которое указывает размер области стека в сегменте данных прикладной программы. Для библитеки параметр
 размера стека игнорируется (библиотека использует стек прикладной программы, которая ее вызывает). Параметр "размер_динамической_области" должен быть числом в диапазоне от 0 до 655360 и задает размер локальной динамически распределяемой области памяти в
 сегменте данных. 
     Сегмент стека и динамически распределяемая область памяти обсуждаются в Главе 4 "Переменные" и в Главе 16 "Использование памяти". 
     Директива $M при использовании ее в программном модуле (unit) не оказывает влияния на компиляцию программы. 
                Арифметический сопроцессор

     Синтаксис: {$N+} или {$N-}

     По умолчанию: {$N-}

     Тип: Глобальный.

     Эквивалент меню: OptionsіCompilerі80x87 code (ПараметрыіКомпиляторіКод сопроцессора 80х87). 
     Данная директива позволяет переключаться между двумя различными режимами поддерживаемыми Турбо Паскалем модулями генерации кода с плавающей точкой. В состоянии {$N-} генерируется код для выполнения всех вычислений вещественными числами программным п
утем, с помощью вызова подпрограмм библиотеки исполняющей системы. В состоянии {$N+} генерируется код для выполнения операций с вещественнми числами с помощью арифметического сопроцессора. 
                       Файл ресурсов

     Синтаксис: {$R имя_файла}

     Тип: Локальный.

     ДЖиректива $R задает имя файла ресурсов, который должен включаться в прикладную программу или библиотеку. Указанный файл должен представлять собой файл ресурсов Windows. По умолчанию он имеет расширение .RES. 
     Когда директива {$R имя_файла} используется в модуле, указанное имя файла просто записывается в получаемый файл .TPU. Никаких проверок для обеспечения корректности файла с указанным именем и его существования не выполняется. 
     При компоновке прикладной программы или библиотеки (после компиляции программы или исходного файла библиотеки), обрабатываются файлы ресурсов, заданные во всех используемых модулях, программе или в библиотеке, и каждый ресурс в каждом файле ресурсов
 копируется в создаваемый файл .EXE или .DLL. На этапе обработки ресурсов копмоновщих Турбо Паскаля ищет файлы ресурсов в текущем каталоге и в каталогах, заданных в окне ввода OіDіResource Directories (ПараметрыіКаталогиіКаталоги файлов ресурсов) или в к
аталогах, заданных в директиве /R компилятора TPWC. 
                       Условная компиляция

     Директивы условной компиляции языка Турбо Паскаль позволяют с помощью условных идентификаторов получать различный код из одного и того же исходного текста. 
     Имеются две основные конструкции условной компиляции, которые весьма похожи на оператор Паскаля if. Первой конструкцией является конструкция: 
     {$IFxxx} ... {$ENDIF}
 которая приводит к компиляции исходного текста между {$IFxxx} и {$ENDIF} только в случае, если условие, указанное в {$IFxxx}, удовлетворяется (имеет значение True). Если же это условие имеет значение False, то исходный текст между этими двумя директивам
и игнорируется. 
     Второй конструкцией условной компиляции является конструкция: 
     {$IFxxx} ... {$ELSE} ... {$ENDIF}
 которая приводит к компиляции либо исходного текста между {$IFxxx} и {$ELSE}, или исходного текста между {$ELSE} и {$ ENDIF} в зависимости от условия, указанного с помощью {$IFxxx}. 
     Приведем некоторые примеры конструкций условной компиляции. 
     {$IFDEF Debug}
       Writeln('X=',X);

     {$ENDIF}

     {$IFDEF CPU87}
       {$N+}
       type
      real = double;
     {$ELSE}
       {$N-}
       type
      single = real;
         double = real;
         extended = real;
         comp = real;
     {$ENDIF}

     Конструкции условной компиляции могут вкладываться одна в другую (допускается до 16 уровней вложенности). Для каждого {$IFxxx} соответствующая директива {$ENDIF} должна находиться в том же исходном файле. Это значит, что в каждом исходном файле долж
но быть равное количество директив {$IFxxx} и {$ENDIF}. 
                     Условные идентификаторы

     Условная компиляция основывается на вычислении условных идентификаторов. Условные идентификаторы определяются и разопределяются (становятся неопределенными) с помощью директив: 
     {$DEFINE name}
     {$UNDEF name}

     Вы можете также воспользоваться переключателем /D в компиляторе TPWC и элементом ввода Conditional Defines (Условные определения) меню OptionsіCompiler (ПараметрыіКомпилятор) интегрированной среды. 
     Условные идентификаторы лучше всего сравнить с булевскими переменными: они могут принимать значения True (определено) или False (неопределено). Директива {$DEFINE} устанавливает данный символ в значение True, а директива {$ UNDEF} устанавливает его 
в значение False. 
     Условные идентификаторы следуют точно таким же правилам, что и идентификаторы Паскаля: они должны начинаться буквой, за которой следуют сочетания букв, цифр, подчеркиваний. Они могут иметь любую длину, но только первые 63 символа являются значащими.
 
     Условные идентификаторы и идентификаторы Паскаля не имеют друг с другом никакой связи. На условные идентификаторы не могут осуществляться ссылки в действующей программе, а на идентификаторы программы нельзя осуществлять ссылки в условных директивах.
 Например, конструкция: 
                 const
                   Debug = True;
                 begin
                   {$IFDEF Debug}
                   Writeln('Debug is on');
                   {$ENDIF}
                 end;
 не приведет к компиляции оператора Writeln, также как и конструкция: 
                 {$DEFINE Debug}
                 begin
                   if Debug then writeln ('Debug is on');
                 end;
 приведет к ошибке в операторе IF из-за неизвестного идентификатора. 
     В Турбо Паскале определены следующие стандартные идентификаторы: 
     VER10

     Всегда определен, указывая, что данная версия является версией 1.0 Турбо Паскаля для Windows. Другие версии будут определять собственные соответствующие символы версий, например, символ VER20 для версии 2.0 и т.д. 
     MSDOS

     Всегда определен, указывая, что данная операционная система является операционной системой DOS. Версии Турбо Паскаля для других операционных систем будут определять символьное имя для конкретной операционной системы. 
     CPU86

     Всегда определен, указывая, что процессор принадлежит к семейству процессоров 80х86. Версии Турбо Паскаля для других процессоров будут определять символьное имя для конкретного процессора. 
     CPU87

     Определен, если арифметический сопроцессор 8087 присутствует во время компиляции. Если конструкция: 
         {$IFDEF CPU87} {$N+} {$ELSE} {$N-} {$ENDIF}
 появляется в начале компиляции, то Турбо Паскаль автоматически выберет соответствующую модель генерирации кода вычисления с плавающей точкой для этой конкретной ЭВМ. 
     Остальные условные идентификаторы могут устанавливаться перед компиляцией с помощью поля ввода ConditionalDefines (Условные определения) меню OptionsіCompiler (ПараметрыіКомпилятор) интегрированной среды или параметра командной строки /D компилятора
 TPWC. 
                        Директива DEFINE

     Синтаксис: {$DEFINE имя}

     Примечание: Директива $DEFINE определяет условный идентификатор данного имени. Идентификатор будет определенным для оставшейся части исходного компилируемого кода или до тех пор, пока он не появится в директиве {$UNDEFINE имя}. Директива {$DEFINE им
я} не вызывает никаких действий, если "имя" уже определено. 
                         Директива UNDEF

     Синтаксис: {$UNDEF имя}

     Примечание: Директива $UNDEF отменяет ранее определенный условный идентификатор. Для оставшейся части исходного компилируемого кода или до тех пор, пока он не появится в директиве {$DEFINE} идентификатор разопределяется (становится неопределенным). 
Директива {$UNDEF} имя не вызывает никакий действий если "имя" уже отменено. 
                         Директива IFDEF

     Синтаксис: {$IFDEF идентификатор}

     Примечание: Директива IFDEF компилирует следующий за ней исходный текст, если имя "идентификатор" определено. 
                        Директива IFNDEF

     Синтаксис: {$IFNDEF идентификатор}

     Примечание: Директива IFNDEF компилирует следующий за ней исходный текст, если имя "идентификатор" не определено. 
                         Директива IFOPT

     Синтаксис: {$IFOPT переключатель}

     Примечание: Директива IFOPT компилирует следующий исходный текст, если "переключатель" находится в данное время в указанном состоянии. Переключатель (директива) состоит из имени директивы-переключателя, за которым следует знак плюс (+) или знак мину
с (-). Например, конструкция: 
     {$IFOPT N+}
       type real = extended;
     {$ENDIF}
 скомпилирует описание типа, если директива $N является в данное время действующей. 
                         Директива ELSE

     Синтаксис: {$ELSE}

     Примечание: Директива ELSE приводит к компиляции или игнорированию исходного текста, ограниченного последним {$IFxxx} и следующим {$ENDIF}. 
                         Директива ENDIF

     Синтаксис: {$ENDIF}

     Примечание: Директива ENDIF заканчивает условную компиляцию, начатую последней директивой {$IFxxx}.  


Яндекс цитирования