Директивы IFDEF и IFNDEF проверяют, определен ли заданный
идентификатор. Эти идентификаторы определяются с помощью DEFINE и
UNDEF. (Можно также определять идентификаторы в командной строке
или в IDE.)
Чтобы определить идентификатор, включите в программу следую-
щую директиву:
{$DEFINE идентификатор}
где "идентификатор" в плане длины, разрешенных символов и других
спецификаций подчиняется обычным правилам для имен идентификато-
ров. Например, вы можете записать:
{$DEFINE debug}
Этим для остальной части компилируемого модуля или до следу-
ющего оператора:
{$UNDEF debug}
определяется идентификатор debug.
Директива UNDEF "разопределяет" идентификатор. Если иденти-
фикатор не определен, то она не действует.
Определение условных идентификаторов в IDE
Вместо того, чтобы вставлять директиву DEFINE в свой исход-
ный код, вы можете также определить условные идентификаторы и
блоке ввода Conditional Defines (Условные определения). Определи-
те идентификаторы, введя их в блоке ввода и разделив точками за-
пятой. Например, в следующем примере определяются два условных
идентификатора - TestCode и DebugCode:
TestCode:DebugCode
Предопределенные идентификаторы
Кроме определяемых вами идентификаторов вы можете также про-
верять отдельные идентификаторы, определяемые компилятором:
Предопределенные условные идентификаторы Таблица 4.4
┌───────────────────┬───────────────────────────────────────────┐
│ Идентификатор │ Показывает │
├───────────────────┼───────────────────────────────────────────┤
│ 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. │
└───────────────────┴───────────────────────────────────────────┘
Подробнее о предопределенных условных идентификаторах компи-
лятора рассказывается в Главе 2 ("Директивы компилятора") "Руко-
водства программиста".
Идентификаторы 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}
Примечание: Полное описание всех параметров компилято-
ра вы можете найти в Главе 2 ("Директивы компилятора")
"Справочного руководства программиста".