Основное использование выражений времени компиляции следующее:
{$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}
|