2.4.2. Использование

На верх  Назад  Вперёд

Основное использование выражений времени компиляции следующее:

{$if expr}
  CompileTheseLines;
{$endif}

Если expr возвращает TRUE, то CompileTheseLines будет включено в исходный код.

Подобно обычному Паскалю, можно использовать {$ELSE }:

{$if expr}
  CompileTheseLines;
{$else}
  BetterCompileTheseLines;
{$endif}

Если expr возвращает TRUE, то будет компилироваться CompileTheseLines. Иначе будет компилироваться BetterCompileTheseLines.

Кроме того, можно использовать {$ELSEIF}

{$IF expr}
// …
{$ELSEIF expr}
// …
{$ELSEIF expr}
// …
{$ELSE}
// …
{$ENDIF}

В добавок к описанным выше конструкциям, которые также поддерживаются Delphi, можно создавать эквивалентные конструкции в режиме MacPas:

{$IFC expr}
//…
{$ELIFC expr}

{$ELIFC expr}

{$ELSEC}

{$ENDC}

То есть IFC соответствует IF, ELIFC соответствует ELSEIF, ELSEC эквивалентно ELSE, а ENDC эквивалентно ENDIF. Дополнительно IFEND эквивалентно ENDIF:

{$IF EXPR}
  CompileThis;
{$ENDIF}

В режиме MacPas возможно комбинировать эти конструкции.

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

{$ifdef fpc}
var
  y : longint;
{$else fpc}
var
  z : longint;
{$endif fpc}
var
  x : longint;
begin
{$IF (FPC_VERSION > 2) or
  ((FPC_VERSION = 2)
  and ((FPC_RELEASE > 0) or
     ((FPC_RELEASE = 0) and (FPC_PATCH >= 1))))}
  {$DEFINE FPC_VER_201_PLUS}
{$ENDIF}
{$ifdef FPC_VER_201_PLUS}
{$info At least this is version 2.0.1}
{$else}
{$fatal Problem with version check}
{$endif}
 
{$define x:=1234}
{$if x=1234}
{$info x=1234}
{$else}
{$fatal x should be 1234}
{$endif}
 
{$if 12asdf and 12asdf}
{$info $if 12asdf and 12asdf is ok}
{$else}
{$fatal $if 12asdf and 12asdf rejected}
{$endif}
 
{$if 0 or 1}
{$info $if 0 or 1 is ok}
{$else}
{$fatal $if 0 or 1 rejected}
{$endif}
 
{$if 0}
{$fatal $if 0 accepted}
{$else}
{$info $if 0 is ok}
{$endif}
 
{$if 12=12}
{$info $if 12=12 is ok}
{$else}
{$fatal $if 12=12 rejected}
{$endif}
 
{$if 12<>312}
{$info $if 12<>312 is ok}
{$else}
{$fatal $if 12<>312 rejected}
{$endif}
 
{$if 12<=312}
{$info $if 12<=312 is ok}
{$else}
{$fatal $if 12<=312 rejected}
{$endif}
 
{$if 12<312}
{$info $if 12<312 is ok}
{$else}
{$fatal $if 12<312 rejected}
{$endif}
 
{$if a12=a12}
{$info $if a12=a12 is ok}
{$else}
{$fatal $if a12=a12 rejected}
{$endif}
 
{$if a12<=z312}
{$info $if a12<=z312 is ok}
{$else}
{$fatal $if a12<=z312 rejected}
{$endif}
 
{$if a12<z312}
{$info $if a12<z312 is ok}
{$else}
{$fatal $if a12<z312 rejected}
{$endif}
 
{$if not(0)}
{$info $if not(0) is OK}
{$else}
{$fatal $if not(0) rejected}
 
{$endif}{$IF NOT UNDEFINED FPC}
// Обнаружить элементы FPC при компиляции на MAC.
{$SETC TARGET_RT_MAC_68881:= FALSE}
{$SETC TARGET_OS_MAC := (NOT UNDEFINED MACOS)
              OR (NOT UNDEFINED DARWIN)}
{$SETC TARGET_OS_WIN32 := NOT UNDEFINED WIN32}
{$SETC TARGET_OS_UNIX := (NOT UNDEFINED UNIX)
              AND (UNDEFINED DARWIN)}
{$SETC TYPE_EXTENDED := TRUE}
{$SETC TYPE_LONGLONG := FALSE}
{$SETC TYPE_BOOL := FALSE}
{$ENDIF}
 
{$info ***********************************************************}
{$info * Теперь должно следовать не менее 2 сообщений об ошибке: *}
{$info ***********************************************************}
 
{$if not(0}
{$endif}
{$if not(<}
{$endif}
end.

Как вы можете видеть в этом примере, эти конструкции не приносят пользы, если используются с обычными идентификаторами. Только если вы используете макросы, которые описаны в разделе 2.2. Макросы, они могут оказаться очень полезны. Чтобы проверить этот пример, вы должны включить поддержку макросов с помощью переключателя командной строки -Sm.

Следующий пример работает только в режиме MacPas:

{$SETC TARGET_OS_MAC := (NOT UNDEFINED MACOS) OR (NOT UNDEFINED DARWIN)}
 
{$SETC DEBUG := TRUE} {$SETC VERSION := 4}
{$SETC NEWMODULEUNDERDEVELOPMENT := (VERSION >= 4) OR DEBUG}
{$IFC NEWMODULEUNDERDEVELOPMENT}
  {$IFC TARGET_OS_MAC}
  //  … новый код mac
  {$ELSEC}
  //  … новый другой код
  {$ENDC}
{$ELSEC}
  старый код
{$ENDC}