Условная компиляция предназначена для управления компиляцией программного кода. В Delphi имеется несколько способов её реализации, но в основном используются только четыре.
Первый способ:
1 2 3 |
{$IFDEF …} //Код программы {$ENDIF} |
В этой реализации условная директива {$IFDEF …} проверяет, был ли определён указанный в ней символ условной компиляции. Если да, то код программы между директивами {$IFDEF …} и {$ENDIF} компилируется. В противном случае, код между этими двумя директивами компилироваться не будет.
Второй способ:
1 2 3 4 5 |
{$IFDEF …} //Код программы {$ELSE} //Код программы {$ENDIF} |
Эта реализация отличается от предыдущей наличием директивы {$ELSE}. В этом случае, если условный оператор определён, будет компилироваться код программы между директивами {$IFDEF} и {$ELSE}. В противном случае, будет компилироваться код программы между директивами {$ELSE} и {$ENDIF}.
По сути, первая и вторая реализации ведут себя как краткая и полная форма обычного условного оператора if.
Как определить символ условной компиляции? Для этого также существует два способа.
Первый – использование директивы {$DEFINE}
1 |
{$DEFINE MYSYMBOL} |
Второй способ. Определить его в свойствах проекта. Для этого в меню Project нужно выбрать пункт Options и в поле Conditional defines ввести символ условной компиляции.
Третий и четвёртый способы являются аналогией первого и второго соответственно. Отличие в том, что используется условная директива {$IFNDEF}. Эта директива проверяет, что указанный символ не определён. То есть, является прямой противоположностью директивы {$IFDEF}.
В случае {$IFNDEF}, код между этой директивой и {$ENDIF} либо {$ELSE} будет скомпилирован, только если указанный в ней символ условной компиляции не определён. В остальном, принцип реализации аналогичен приведённому для директивы {$IFDEF}:
1 2 3 4 5 6 7 8 |
{$IFNDEF …} //Код программы {$ENDIF} {$IFNDEF …} //Код программы {$ELSE} //Код программы {$ENDIF} |
В Delphi уже имеется ряд символов условной компиляции. Вот их «классический» набор.
Символ условной компиляции | Значение |
MSWINDOWS | Код компилируется только в ОС Windows |
WIN32 | То же самое, только код компилируется лишь для 32-разядной ОС. |
LINUX | Был введён в Delphi 6 вместе с MSWINDOWS для определения платформы, для которой необходимо компилировать тот или иной код.Так как компиляция для Linux в Delphi до сих пор отсутствует, то использование этого символа в программах не имеет смысла. |
CONSOLE | Консольное приложение |
CPU386 | Компиляция для процессоров типа i386 или более современных. Так как речь идёт о процессорах типа i386, использование данного символа уже давно потеряло актуальность. |
CONDITIONAL EXPRESSIONS | Проверяет использование директив $IF |
Также в число «классических» входит и символ VERxxx, который указывает конкретную версию компилятора. По сути, это целое семейство символов условной компиляции, в которое с выходом новой версии Delphi добавляется новый символ соответствующий этой версии. Ниже представлена таблица соответствия версий Delphi символам условной компиляции VERxxx (материал взят с Исходники.ру).
Версия Delphi | Символ условной компиляции |
1 | VER80 |
2 | VER90 |
3 | VER100 |
4 | VER120 |
5 | VER130 |
6 | VER140 |
7 | VER150 |
8 | VER160 |
2005 | VER170 |
2006 | VER180 |
2007* | VER180 или VER185 |
2009 | VER200 |
2010 | VER210 |
XE | VER220 |
XE2 | VER230 |
XE3 | VER240 |
XE4 | VER250 |
XE5 | VER260 |
XE6 | VER270 |
XE7 | VER280 |
XE8 | VER290 |
10 Seatle | VER300 |
10.1 Berlin | VER310 |
10.2 Tokyo | VER320 |
*-версии 2006 и 2007 совместимы между собой на уровне двоичного кода. Поэтому, для поддержки обеих версий следует использовать символ VER180. Если необходима поддержка только версии 2007, необходимо использовать символ VER185.
После выхода в 2011 году кроссплатформенной библиотеки FireMonkey, были введены новые символы условной компиляции для MacOS и iOS. А, в 2013 году с появлением поддержки Android был введён и специальный символ условной компиляции для этой ОС. Ниже представлен перечень этих символов.
Платформа | Символ условной компиляции |
MacOS | MACOS |
iOS | IOS |
Android | ANDROID |
Условная компиляция на примере кроссплатформенного приложения:
1 2 3 4 5 6 |
{$IFDEF MSWINDOWS} ShowMessage(‘Windows’); {$ENDIF} {$IFDEF ANDROID} ShowMessage(‘Android’); {$ENDIF} |
Добавить комментарий