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

2.1.1.1. Условная компиляция (Первичная реализаци)

2.1.1.1.1. Основные положения

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

Синтаксически анализатор должен поддерживать следующие выражения:

{$IFDEF MY_DEFINE}
{$ENDIF}

{$IFDEF MY_DEFINE}
{$ELSE}
{$ENDIF}

{$IFNDEF MY_DEFINE}
{$ENDIF}

{$IFNDEF MY_DEFINE}
{$ELSE}
{$ENDIF}

{$IF MY_DEFINE}
{$ENDIF}
// Если MY_DEFINE отсутствует, услове равно FALSE.
// Если MY_DEFINE = null, услове равно FALSE.
// Если MY_DEFINE = False (строка) или 0, услове равно FALSE.
// Если MY_DEFINE = True (строка) или 1, услове равно TRUE.
// Если MY_DEFINE = {Иное значение}, предкомпиляци выдаёт ошибку

{$IF MY_DEFINE > 2.0.0.1}
{$ENDIF}

{$IF MY_DEFINE > 2.0.0.1}
{$ELSE}
{$ENDIF}

Условия предкомпиляции могут быть вложенными.

  • Директивы компиляции указываются глобально, при старте приложения.
  • Каждая директива компиляции является парой ключ-значение. Директива может иметь значение null, что равносильно отсутсвию значения.
  • Разработчик предметной области не может управлять значениями директив в процессе выполнения приложения.
  • Предполагается, что в список директив компиляциии будет настраиваться для модулей предметной области и загружаться из БД при старте приложения.

2.1.1.1.2. Правила именования директив

  • Имена директив регистроНЕзависимы
  • Имена могут содержать алфавитные символы, числа, символ ‘_’
  • Имена не могут содержать пробелов
  • Имя должно начинаться с алфавитного символа

2.1.1.1.3. Правила сравнения значений директив

Директива может иметь следующие типы значений:

  1. Нет зачения
  2. Число дробное или целое: 1000 , 200.5 , 0.5
  3. Строка: ‘Любаястрока’
  4. № версии: a , a.b.c.d  , где a,b,c.d целые числа. Формат ввода: a.[b].[c[.[d]]]

Возможны следующие условия сравнения: < , >, = , <>, >=, <= Директива не имеющая значения, приравнивается к отсутствующей. Выражения типа {$IF MY_DEFINE > 2.0.0.1} вычисляются по следующим правилам:

  1. MY_DEFINE не существует. (MY_DEFINE > 2.0.0.1) == False
  2. MY_DEFINE существует и равно Null. (MY_DEFINE > 2.0.0.1) == False
  3. MY_DEFINE существует и равно 1.0.2. (MY_DEFINE > 2.0.0.1) == False
  4. MY_DEFINE существует и равно 4.0.2. (MY_DEFINE > 2.0.0.1) == True

2.1.1.1.4. Правила сравнения номеров версий

При вычислении выражений типа {$IF DesktopVer > 5.4.10.3680} учитывается сквозная нумерация сборок. Версия клиента и номер сборки сравниваются отдельно. Итоговый результат расчитывается как ‘(результат сравнения версии) И (результат сравнения номера сборки)’

То есть:

  1. Версия клиента больше, номер сборки больше (5.5.0.9680 > 4.30.68.3680) == True
  2. Версия клиента больше, номер сборки меньше (5.5.0.3680 > 4.30.68.9680) == False
  3. Версия клиента меньше, номер сборки меньше (4.30.68.3680 < 5.5.0.9680) == True
  4. Версия клиента меньше, номер сборки больше (4.30.68.9680 < 5.5.0.3680) == False

Changed in version 5.5: Добавлен учёт сквозной нумерации сборок.

Attention

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

Пример
{$IF DesktopVer > 5.4.10}
  {$IF BuildVer > 3680}
    ...
  {$ENDIF}
{$ENDIF}

2.1.1.1.4.1. Маска версий в сравнении

  • Если какие-то индексы в номере версии не важны для сравнения, их можно пропустить.
  • На месте пропуска не должно быть пробелов или иных символов, в противном случае клиент покажет сообщение об ошибке.
  • Если пропущенные индексы находятся в конце номера версии, точки-разделители также можно опустить, а если где-то в середине - их необходимо указать для обозначения позиций индексов в номере версии.

То есть:

  1. (5.5 = 5..5) == True
  2. (5.5.0.9680 > 5…3680) == True
  3. (5…9680 > 4.30) == True
  4. (5.5 = 4) == False

2.1.1.1.5. Системные директивы

При старте приложения в окружение регистриует следующие директивы

  • Web - не имеет значения. Регистрируется при запуске Web-окружения
  • WebVer - Версия web-окружения. Регистрируется при запуске Web-окружения
  • Desktop - не имеет значения. Регистрируется при запуске desktop-окружения
  • DesktopVer - Версия desktop-окружения. Регистрируется при запуске desktop-окружения

2.1.1.1.6. Примеры

  1. Проверка версии десктопного приложения.
<pascal>
  {$IF DesktopVer <= 4..}
    ShowMessage( 4 );
  {$ELSE}
    ShowMessage( 5 );
  {$ENDIF}
</pascal>

2.1.1.1.7. Используемые определения

  • Desktop Приложение
    • DesktopVer - версия приложения, тип данных - версия
    • DesktopBuild - номер сборки приложения, тип данных - целое. Тоже значение что и в 4-й позиции версии (DesktopVer)