Предопределенные идентификаторы
Кроме определяемых вами идентификаторов вы можете также проверять отдельные идентификаторы, определяемые компилятором:
Предопределенные условные идентификаторыИдентификатор | Показывает | CPU86 | Данная версия Borland Pascal предназначена для семейства процессоров 80х86. | CPU87 | Присутствует арифметический сопроцессор 80х87. | DPMI | Данная версия предназначена для операционной среды защищенного режима DOS. При создании приложений для защищенного режима DOS данный идентификатор доступен для BP.EXE. | MSDOS | Данная версия предназначена для операционной системы MS-DOS. Данный идентификатор доступен в BP.EXE только при создании приложений DOS реального или защищенного режима и в TURBO.EXE. | VER70 | Данная версия является версией 7.0 компилятора. | WINDOWS | Данная версия предназначена для операционной среды Windows. Данный идентификатор доступен в BP.EXE и в BPW.EXE, когда целевой платформой является Windows. |
Идентификаторы IFxxx, ELSE и ENDIF
Смысл условных директив в том, что если определен или нет конкретный идентификатор либо если установлен или нет конкретный параметр, вы можете выбирать для компиляции некоторые части исходного кода. Они имеют следующий общий формат, где IFxxx - это директивы IFDEF, INDEF или IFOPT, за которыми следует соответствующий аргумент, а "исходный код" - любое количество исходного кода Паскаля.
{$IFxxx} исходный код {$ENDIF}
Если выражение в директиве IFxxx принимает значение True, то "исходный код" компилируется; в противном случае он игнорируется и интерпретируется как обычный комментарий в программе.
Часто у вас имеются альтернативные фрагменты кода. Если выражение принимает значение True, то компилируется один фрагмент кода, а если False - другой. Компилятор позволяет сделать это с помощью директивы $ELSE:
{$IFxxx} исходный код A {$ELSE} исходный код B {$ENDIF}
Если выражение в IFxxx равно True, то компилируется "исходный код A", в противном случае компилируется "исходный код B".
Все директивы IFxxx должны завершаться с одном исходном файле. Это означает, что они не могут начинаться в одном исходном файле и заканчиваться в другом. Однако, в директиве IFxxx может указываться включаемый файл:
{$IFxxx} {$I file1.pas} {$ELSE} {$I file2.pas} {$ENDIF}
Таким образом, на основе некоторого условия вы можете выбирать альтернативные включаемые файлы
Допускается использовать вложенные конструкции IFxxx..ENDIF, так что вы можете записать, например, следующее:
{$IFxxx} { первая директива IF } . . . {$IFxxx} { первая директива IF } . . .
{$ENDIF} { завершает вторую директиву IF } . . . {$ENDIF} { завершает первую директиву IF }
Директивы IFDEF и IFNDEF
Директивы IFDEF и IFNDEF позволяют вам условно компилировать код на основе определения или неопределения некоторых идентификаторов.
Директивы IFDEF и IFNDEF обычно используются для включения в компилируемый код отладочной информации. Например, если вы поместите в начало каждого модуля следующий код:
{$IFDEF debug} {$D+,L+} {$ELSE} {$D-,L-} {$ENDIF}
а в начало программы следующую директиву:
{$DEFINE debug}
и компилируете свою программу, для использования с Турбо отладчиком генерируется полная отладочная информация. Аналогично, вы можете иметь фрагменты кода, компилируемые только при отладке. В этом случае можно записать:
{$IFDEF debug} исходный код {$ENDIF}
где "исходный код" компилируется только в том случае, если в данной точке определен идентификатор debug.
Директива IFOPT
Иногда включить или исключить код желательно в зависимости от того, какой выбран параметр компилятора (проверка диапазона, проверка ввода-вывода и т.д.). Вы можете сделать это с помощью директивы IFOPT, которая имеет две формы:
{$IFOPT x+} и {$IFOPT x-}
где x - один из параметров компилятора. При использовании первой формы содержащийся ниже код будет компилироваться, если параметр компилятора в данный момент разрешен; при использовании второй формы код компилируется при запрещении параметра. Например, чтобы выбрать тип данных для списка переменных на основе того, разрешена или нет поддержка сопроцессора 80х87, можно использовать следующий исходный код:
var {$IFOPT N+} Radius,Circ,Area: Double; {$ELSE} Radius,Circ,Area: Real; {$ENDIF} 1 2
8 8 8
| |