



                        ПРИЛОЖЕНИЕ В

                   Директивы компилятора

     Некоторые из возможностей компилятора Турбо-Паскаля ре-
ализуются с помощью директив компилятора. Директива компиля-
тора представляет собой комментарий со специальным синтакси-
сом.  Турбо-Паскаль  допускает  директивы компилятора везде,
где допускаются комментарии.
     Директива компилятора начинается со знака  $,  стоящего
первым  после открывающего граничного знака комментария. Не-
посредственно после знака $ следует имя (одна или  несколько
букв),  которое определяет конкретные директивы. Имеются три
типа директив:

     - Директивы переключения. Эти директивы включают  конк-
ретные  возможности  компилятора  или выключают их с помощью
указания знака плюса "+" или минуса "-"  сразу  после  имени
директивы.
     - Директивы с параметрами. Эти директивы  задают  пара-
метры, оказывающие влияние на компиляцию,  такие,  например,
как имена файлов и размеры памяти.
     - Условные директивы. Эти  директивы  используются  для
управления условной компиляцией частей исходного текста, ос-
нованной на определении пользователем условных символов.

     Все  директивы  за  исключением  директив  переключения
должны  по  иметь крайней мере  один пробел между именем ди-
рективы и параметром.
     Ниже приводятся некоторые примеры директив компилятора:

     {$B+}
     {$R- Turn off range-checking}
     {$I TYPES.INC}
     {$U C:\UNITS\MEM}
     {$M 65520,8192,655360}
     {$DEFINE Debug}

                                - 2 -


     {$IFDEF Debug}
     {$ENDIF}

     Директивы компилятора вы можете разместить  непосредст-
венно  в  исходном  коде программы. Можно также изменить ис-
пользуемые по умолчанию директивы с помощью компилятора, ис-
пользующего  командную строку (TPC.EXE) или с помощью компи-
лятора, работающего в диалоговой среде (TURBO.EXE). Все  ди-
рективы  компилятора  можно  задавать  с помощью меню выбора
возможностей  компилятора (Options/Compiler Menu). Все  вно-
симые вами в меню изменения будут иметь силу при последующих
компиляциях (более детальное описание дается в Приложении  А
"Руководства  пользователя").  При  использовании командного
компилятора директивы компилятора можно либо задавать в  ко-
мандной  строке  (например, TPC /$R+ MYPROG), либо поместить
их в файл конфигурации TPC.CFG (см. Приложение G "Руководст-
ва пользователя"). Директивы компилятора, которые содержатся
в исходном коде, всегда отменяют принятые по умолчанию  зна-
чения директив. Это справедливо как для компилятора, работа-
ющего в режиме командной строки, так  и  для  интерактивного
компилятора.

                   Директивы переключения

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



     {$B+,R,S-}

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

                    Выравнивание данных

     Синтаксис: {$A+} или {$A-}
     По умолчанию: {$A+}
     Тип: Глобальный.
     Эквивалент меню: "Опции/Компилятор/Выравнивание данных"
(Option/Compiler/Align Data).

     Данная директива позволяет переключаться между выравни-
ванием переменных и типизованных констант на границу слова и
на границу байта. Для процессора 8088 выравнивание на грани-
цу слова игнорируется. Однако для всех процессоров 80х86 вы-
равнивание на границу слова означает более быстрое  выполне-
ние, поскольку адресация ко всем элементам, имеющим размер в
слово или четным адресам происходит за один цикл обращения к
памяти вместо двух.
     В состоянии {$A+} все переменные и  типизованные  конс-
танты,  превышающие  по  размеру один байт, выравниваются на
границу машинного слова (адреса  с  четными  значениями).  В
случае необходимости между переменными для достижения вырав-
нивания на границу слова включаются дополнительные неисполь-
зуемые  байты.  Директива  {$A+}  не влияет ни на переменные
размером в байт, ни на поля структур или элементы  массивoв.
Поле  записи  будет  выравниваться на границу слова только в
том случае, если общий размер всех следующих перед ним полей
будет иметь четное значение. Аналогично, для любого элемента
массива выравнивание на  границу  слова  будет  иметь  место
только когда размер элементов имеет четное значение.
     В состоянии {$A-} никаких действий по  выравниванию  не
предпринимается. Переменные и типизованные константы незави-
симо от их размера помещаются в этом случае просто по следу-
ющему доступному адресу.

                                - 4 -



           Примечание: Независимо от директивы $A+ в разделе
      описаний кождое описание var и const всегда начинается
      на границе слова.  Аналогично,  компилятор  компилятор
      всегда старается поддерживать указатель стека (SP) вы-
      ровненным на границу слова, для чего в случае  необхо-
      димости  для стека процедуры выделяется дополнительный
      неиспользуемый байт.

                    Булевские вычисления

     Синтаксис: {$B+} или {$B-}
     Значение по умолчанию: {$B+}
     Тип: Локальный.
     Эквивалент меню:  "Опции/Компилятор/Булевские  вычисле-
ния" (Options/Compiler/Boolean Evaluation).

     Эта директива осуществляет два различных вида генериро-
вания кода для булевских операторов and и or.
     В состоянии {$B+} компилятор генерирует код для полного
вычисления булевского выражения. Это значит, что каждый опе-
ранд булевского выражения, состоящий из операторов and и or,
будет  вычислен, даже если результат всего выражения заранее
известен.
     В состоянии {$B-} компилятор генерирует код для  вычис-
ления булевского выражения по короткой схеме, то есть вычис-
ление прекратится сразу, как станет очевидным результат  вы-
числения  всего этого выражения. Более подробно смотрите ин-
формацию в разделе "Булевские операции" .

                   Информация для отладки

     Синтаксис: {$D+} или {$D-}
     По умолчанию: {$D+}
     Тип: Глобальный.
     Эквивалент меню: "Опции/Компилятор/Информация  для  от-
ладки" (Options/Compiler/Debug Information).


                                - 5 -


     Данная директива задает или отменяет генерацию информа-
ции по отладке. Отладочная информация состоит из таблицы но-
меров строк для каждой процедуры, устанавливающей соответст-
вие  адресов объектных кодов с номерами строк исходного тек-
ста.
     Когда эта возможность задана для данной  программы  или
модуля,  встроенный  отладчик Турбо-Паскаля позволяет прохо-
дить этот модуль по шагам и  устанавливать  точки  останова.
Кроме  того,  при появлении ошибки во время выполнения прог-
раммы или программного модуля, который был  скомпилирован  с
включенной    опцией    информации   об   отладке   ({$D+}),
Турбо-Паскаль использует эту информацию для определения опе-
ратора в исходном тексте, приведшего к появлению ошибки.
     Переключатели       "Отладка/Автономная        отладка"
(Debug/Stand-Alone   Debugging)  и   "Опции/Компоновщик/Файл
МAР" позволяют включить  для данного только информацию о но-
мерах строк (еели этот  модуль  компилировался  в  состоянии
{$D+}).
     Для программных модулей отладочная информация записыва-
ется в файл .TPU вместе с объектным кодом. Отладочная инфор-
мация приводит к увеличению размера файлов  .TPU  и  требует
дополнительного  пространства  при  компиляции  использующей
данный модуль программы, но на размер и скорость работы  вы-
полняемой программы влияния не оказывает.
     Переключатель отладочной информации обычно используется
вместе с переключателем локальных символов, который позволя-
ет включить или выключить генерацию отладочной информации по
локальным символам.

           Примечание: Если вы хотите использовать  для  от-
      ладки  программ  Турбо-отладчик, то задайте компиляцию
      на диск (для чего  нужно  установить  опцию  "Компиля-
      ция/Назначение"   (Compiler/Destination)   в  значение
      Disk) и установить (в значение On) опцию  "Отладка/Ав-
      тономная отладка" (Debug/Stan-Alone Debugging).

                          Эмуляция

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


     По умолчанию: {$E-}
     Тип: Локальный.
     Эквивалент меню: "Опции/Компилятор/Эмуляция" (Options/
Compiler/Emulation).

     Эмуляция разрешает или запрещает компоновку с библиоте-
кой  исполняющей  системы,  которая будет эмулировать работу
сопроцессора 8087 в случае его отсутствия. Когда вы компили-
руете программу в состоянии {$N+,E+}, Турбо-Паскаль выполня-
ет компоновку с полным эмулятором 8087. Полученый в  резуль-
тате  выполняемый файл может использоваться на любом компью-
тере независимо от наличия сопроцессора 8087.  Если исполня-
ющая система находит такой сопроцессор, то она его использу-
ет. В противном случае он эмулируется с  помощью  библиотеки
исполняющей системы.
     В состоянии {$N+,E-} Турбо-Паскаль будет выполнять ком-
поновку  с существенно меньшей по размеру библиотекой работы
с плавающей запятой, которая может использоваться только при
наличии сопроцессора 8087.
     При использовании в  программном  модуле  переключатель
эмуляции сопроцессора 8087 никакого влияния не оказывает. Он
действует только при компиляции программы. Более того,  если
программа  была  скомпилирована в состоянии {$N+}, а все ис-
пользуемые этой программой модули - в  состоянии  {$N-},  то
необходимость  использования  библиотеки исполняющей системы
отпадает и переключатель эмуляции сопроцессора 8087  игнори-
руется.

                   Дальний тип обращений

     Синтаксис: {$F+} или {$F-}
     По умолчанию: {$F-}
     Тип: Локальный.
     Эквивалент меню:  "Опции/Компилятор/Дальние  обращения"
(Option/Compiler/Force Far Calls).

     Данная директива управляет выбором типа вызова последо-
вательно компилируемых процедур и функций. Процедуры и функ-

                                - 7 -


ции, скомпилированные в состоянии {$F+},  всегда  используют
дальний   тип   обращений.   При  указании  директивы  {$F-}
Турбо-Паскаль автоматически выбирает соответствующий тип об-
ращений:  дальний,  если процедура или функция описывается в
разделе интерфейс программной единицы, и ближний в противном
случае.
     Дальний и ближний тип вызова  описываются  полностью  в
Главе 15 "В среде Турбо-Паскаля".

           Примечание: Если программа использует оверлеи, то
      предполагается, что в начале этой программы и в начале
      каждого модуля помещена директива  {$F+},  позволяющая
      выполнить требования по дальнему типу обращения. Более
      подробно это обсуждается в  Главе  13  "Оверлеи".  Для
      программ, использующих процедурные переменные, все та-
      кие процедуры должны использовать вызовы типа FAR (см.
      раздел  "Переменные  процедур",  где  содержится более
      подробная информация).

                   Проверка ошибок ввода-вывода
                Проверка ошибок ввода-вывода

     Синтаксис: {$I+} или {$I-}
     По умолчанию: {$I+}
     Тип: Локальный.
     Эквивалент меню: "Опции/Компилятор/Проверка ошибок  вво-
да-вывода" (Option/Compiler/I/O-Checking).

     Данная директива задает или отменяет генерирование  ав-
томатического  кода, проверяющего результат обращения к про-
цедуре ввода-вывода. Процедуры  ввода-вывода  описываются  в
Главе 10 ("Ввод-вывод"). Если процедура ввода-вывода возвра-
щает ненулевой результат ввода-вывода при включенном  перек-
лючателе (+), то программа завершает работу, выводя на экран
сообщения об ошибке во время выполнения. Если  переключатель
выключен  (-), то результат операции ввода-вывода нужно про-
верять с помощью функции OIResult.


                                - 8 -


              Информация о локальных символах

     Синтаксис: {$L+} или {$L-}
     По умолчанию: {$L+}
     Тип: Глобальный.
     Эквивалент меню:  "Опции/Компилятор/Локальные  символы"
(Options/Compiler/Local Symbols).

     Данная директива приводит в действие или отменяет гене-
райию  информации о локальных символах. Информация о локаль-
ных символах состоит из имен и типов всех локальных перемен-
ных  и констант данного модуля, то есть из символов в секции
реализации модуля и символов, содержащихся  в  процедурах  и
функциях этого модуля.
     Когда для данного модуля задана генерация информации  о
локалных  символах, встроенный отладчик Турбо-Паскаля позво-
ляет вам проверять и модифицировать локальные переменные мо-
дуля.  Кроме того, с помощью меню "Отладчик/Обращения к сте-
ку" (Debug/Calls Stack) можно проверять обращения к процеду-
рам и функциям модуля.
     Переключатели  "Опции/Компоновка/Файл   МAР"   (O/L/Map
File)  и "Отладка/Автономная отладка" (Debug/Stand-Alone De-
bugging) позволяют получить информацию о локальных  символах
для данного модуля, если этот модуль компилировался в состо-
янии {$L+}.
     Для модулей информация о локальных символах записывает-
ся  в файле .TPU наряду с объектным кодом модуля. Эта инфор-
мация увеличивает  размер  файлов (требуется  дополнительное
пространство). Однако на размер и скорость  работы выполняе-
мой программы это влияния не оказывает.
     Переключатель, задающий включение информации о  локаль-
ных  символах,  обычно  используется вместе с переключателем
отладочной информации, который позволяет включить или выклю-
чить  генерацию  таблицы номеров строк для отладки. Заметим,
что в том случае, если переключатель  отладочной  информации
выключен ({$D-}), директива $L будет игнорироваться.


                                - 9 -


           Сопроцессор математических вычислений

     Синтаксис: {$N+} или {$N-}
     По умолчанию: {$N-}
     Тип: Глобальный.
     Эквивалент меню:  "Опции/Компилятор/Числовой  сопроцес-
сор" (Option/Compiler/Numeric Processing).

     Данная директива осуществляет выбор одной из двух моде-
лей генерирования кода вычисления с плавающей запятой, имею-
щихся в Турбо-Паскале. При указании директивы {$N-}  генери-
руется код для выполнения в программном обеспечении всех вы-
числений типа real с помощью вызова программ библиотеки  ис-
польняющей системы Паскаля. При указании директивы {$N+} ге-
нерируется код для выполнения всех вычислений  типа  real  с
помощью сопроцессора математических вычислений 8087.
     Заметим, что для эмуляции сопроцессора 8087  вы  можете
также  использовать также директиву {$E+}. Это дает вам воз-
можность использовать типы данных с  плавающей  запятой  без
необходимости установки микросхемы сопроцессора 8087.

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

     Синтаксис: {$O+} или {$O-}
     По умолчанию: {$O-}
     Тип: Глобальный.
     Эквивалент меню: "Опции/Компилятор/Использование  Овер-
леев" (Options/Compiler/Overlays Allowed).

     Директива $O разрешает или запрещает генерацию оверлей-
ного кода. Турбо-Паскаль разрешает использовать модуль в ка-
честве оверлейного только в том случае, если он был  скомпи-
лирован с директивой {$O+}. В этом случае генератор выполня-
емого кода принимает особые меры при передаче строки от  од-
ного оверлейного модуля другому и установке постоянных пара-
метров.
     Указание  данной директивы в  модуле  не  обязывает вас
использовать  данный  модуль  в  качестве  оврелейного.  Она
просто указывает Турбо-Паскалю, чтобы он  обеспечил  возмож-

                                - 10 -


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

           Примечание:  Директива  компилятора  {$O+}  почти
      всегда используется совместно с директивой компилятора
      {$F+}, что позволяет выполнить  требования  подсистемы
      управления  оверлеями  по  использованию дальнего типа
      вызовов.
           Более подробная информация по генерации  оверлей-
      ного кода содержится в Главе 13 ("Оверлеи").

                      Проверка границ

     Синтаксис: {$R+} или {$R-}
     По умолчанию: {$R-}
     Тип: Локальный.
     Эквивалент  меню:   "Опции/Компилятор/Проверка  границ"
(Options/Compiler/Range-Checking).

     Данный переключатель приводит в действие и отменяет ге-
нерирование  кода с проверкой границ. При указании {$R+} все
выражения с индексированными строками и массивы  проверяются
на предмет нахождения их внутри указанных границ, а все опе-
раторы присваивания скалярным величинам и переменным поддиа-
пазонов  проверяются на нахождение в заданных границах. Если
обнаруживается нарушение диапазона, программа завершает свою
работу,  выводя сообщения об ошибке времени выполнения. При-
веденная в действие проверка границ замедляет  работу  прог-
раммы и увеличивает ее размер. Используйте эту директиву при
отладке, а затем, после получения отлаженной программы, уда-
лите ее.

                Проверка переполнения стека

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


     По умолчанию: {$S+}
     Тип: Локальный.
     Эквивалент  меню:  "Опции/Компилятор/Проверка  перепол-
нения стека" (Options/Compiler/Stack-Checking).

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

            Проверка параметров строкового типа

     Систаксис: {$V+} или {$V-}
     По умолчанию: {$V+}
     Тип: Локальный.
     Эквивалент меню: "Опции/Компилятор/Проверка строк-пара-
метров" (Options/Compiler/Var-String Checking).

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

                  Директивы с параметрами

                       Включить файл

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


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

                Компоновка объектного файла

     Синтаксис: {$L имя_файла }
     Тип: Локальный.
     Эквивалент  меню:   "Опции/Каталоги/Каталоги  объектных
файлов" (Options/Directories/Object Directories).
     Данная директива предписывает компилятору  скомпоновать
указанный  файл  с  компилируемой программой или программным
модулем. Директива $L используется для компоновки кода,  на-
писанного на языке ассемблера для подпрограмм, описанных как
внешние (external). Указанный файл должен быть  перемещаемым
объектным файлом в формате Intel (файл .OBJ). Расширением по
умолчанию для параметра "имя_файла" является .OBJ. Если  па-
раметр "имя_файла" каталог не задан, то в дополнение к поис-

                                - 13 -


ку файла в текущем каталоге Турбо-Паскаль просматривает  ка-
талоги,  указанные в меню "Опции/Каталоги/Каталоги объектных
файлов" или в каталогах,  указанных  в  опции  /0  командной
строки ТРС.
     Более подробно о редактировании  с  языком  ассемблера,
смотрите в Главе 15 "В среде Турбо-Паскаля".

                 Размеры выделяемой памяти

     Синтаксис: {$M раз_стек, мин_об, макс_об}
     По умолчанию: {$M 16384,0,655360}
     Тип: Глобальный.
     Эквивалент   меню:  "Опции/Компилятор/Размеры   памяти"
(Options/Compiler/Memory Sizes).

     Данная директива указывает параметры распределения  па-
мяти программы. Параметр "раз_стек" должен быть целым числом
в диапазоне от 1024 до 65520, которое указывает размер  сег-
мента стека. "Мин_об" должно быть числом в диапазоне от 0 до
655360, а  "макс_об"  должно  быть  числом  в  диапазоне  от
"мин_об" до 655360. Параметры "мин_об" и "макс_об" указывают
соответственно минимальные и максимальные размеры динамичес-
ки распределяемой области памяти.
     Сегмент стека и динамически распределяемая область  па-
мяти обсуждаются в Главе 4 "Переменные" и в Главе 15 "В сре-
де Турбо-Паскаля".

           Примечание: Директива $M не оказывает влияния при
      использовании ее в программном модуле.

                   Имя оверлейного модуля

     Синтаксис: {$O имя_модуля}
     Тип: Локальный.
     Эквивалент меню: Отсутствует.
     Указание в данной  директиве  имени  модуля  превращает
этот модуль в оверлейный.
     При использовании данной директивы в модуле она никако-

                                - 14 -


го  влияния не оказывает. При компиляции программы директива
{$O имя_модуля} задает, какой из используемых программой мо-
дулей нужно поместить в файл
     Эта директива должна указываться после предложения  ис-
пользования  программы.  При попытке использовать в качестве
оверлейного модуль, который не был скомпилирован в состоянии
{$O+},  Турбо-Паскаль  сообщает об ошибке. Любой модуль, имя
которого указывается в параметре "имя_модуля",  должен  быть
скомпилирован  с  установленным  в  интерактивной среде меню
"Разрешение  оверлеев"  (эквивалент  директивы   компилятора
{$O+}).
     Более подробно про оверлеи рассказывается  в  Главе  13
("Оверлеи").

                    Условная компиляция

     Директивы условной компиляции языка Турбо-Паскаль  поз-
воляют  получать различный код из одного и того же исходного
текста при помощи использования условных символов.
     Имеются две основные конструкции  условной  компиляции,
которые  являются  весьма  похожими  на оператор Паскаля if.
Первой конструкцийе является

     {$IFxxx} ... {$ENDIF}

которая  приводит  к  компиляции  исходного   текста   между
{$IFxxx} и {$ENDIF} только в случае, если условие, указанное
в {$IFxxx}  условеи удовлетворяется (имеет  значение  True).
Если  же это условие имеет значение False, то исходный текст
между этими двумя директивами игнорируется.
     Второй конструкцией условной компиляции является

     {$IFxxx} ... {$ELSE} ... {$ENDIF}

которая приводит к компиляции либо  исходного  текста  между
{$IFxxx}  и  {$ELSE},  или  исходного текста между {$ELSE} и
{$ENDIF} в зависимости  от  условия,  указанного  с  помощью
{$IFxxx}.

                                - 15 -


     Приведем некоторые примеры конструкций условной  компи-
ляции.

     {$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  в
компиляторе  ТРС  и выбором меню "Опции/Компилятора/Условные

                                - 16 -


определения" (O/C/Conditional Defines) в интегрированной ин-
терактивной среде.
     Условные символы лучше всего сравнить с булевскими  пе-
ременными:  они  могут  принимать значения 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   из-за  неизвестного
      идентификатора.

                                - 17 -



     В Турбо-Паскале определены следующие стандартные симво-
лы:

     VER50 - Всегда определен, указывая, что  данная  версия
является версией 5.0 Турбо-Паскаля. Другие версии (начиная с
4.0) определяют собственные соответствующие символы  версий,
например, символ VER40 для версии 4.0 и т.д.

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

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

     CPU87 - Определен,если числовой сопроцессор  8087  при-
сутствует  во  время  компиляции.  Если  конструкция {$IFDEF
CPU87} {$N+} {$ELSE} {$N-} {$ENDIF} появляется в начале ком-
пиляции, то Турбо-Паскаль автоматически выберет соответству-
ющую модель генерирования кода вычисления с плавающей  запя-
той для этой конкретной ЭВМ.

     Остальные условные символы могут устанавливаться  перед
компиляцией  с помощью меню "Опции/Компилятор/Условные опре-
деления" или с помощью опции /D командной строки (в  случае,
если вы используете ТРС).

                      Директива DEFINE

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

     Директива $DEFINE определяет  условный  символ  данного
имени.  Символ  будет определюенным для оставшейся части ис-
ходного компилируемого кода или до тех пор, пока он не  поя-

                                - 18 -


вится  в  директиве {$UNDEFINE имя}. Директива {$DEFINE имя}
не вызывает никаких действий, если "имя" уже определено.

                      Директива UNDEF

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

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

     Синтаксис: {$IFDEF символ}

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

                      Директива IFNDEF

     Синтаксис: {$IFNDEF символ}

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

                      Директива IFOPT

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

     Директива IFOPT компилирует следующий  исходный  текст,
если  "переключатель"  находится  в данное время в указанном
состоянии. Переключатель (директива) состоит из имени  опции
переключателя, за которым следует знак плюс (+) или знак ми-
нус (-). Например, конструкция:

     {$IFOPT N+}

                                - 19 -


       type real = extended;
     {$ENDIF}

скомпилирует описание типа, если опция $N является в  данное
время действующей.

                       Директива ELSE

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

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

                      Директива ENDIF

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

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


