IF-Direktive (Object Pascal)

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu Liste der Object Pascal-Compiler-Direktiven - Index

Typ

Bedingte Compilierung

Syntax

{$IF Ausdruck}

Anmerkungen

Der nachfolgende Quelltext wird compiliert, wenn der Ausdruck True ist. Der Ausdruck muss der Object Pascal-Syntax entsprechen und einen booleschen Wert zurückgeben. Er kann deklarierte Konstanten, konstante Ausdrücke sowie die Funktionen Defined und Declared enthalten.

Zum Beispiel:

 
...
{$DEFINE MY_DEFINE}

const LibVersion = 2.1;
...
begin
  ...
  {$IF Defined(MY_DEFINE) and (LibVersion > 2.0) }
    Writeln(1);
  {$ELSE}
    Writeln(2);  // Dieser Code wird nicht ausgeführt
  {$IFEND}
  {$IF Defined(MY_DEFINE) }
    Writeln(3);  // Dieser Code wird ausgeführt
  {$ELSEIF LibVersion > 2.0}
    Writeln(4);  // Dieser Code wird nicht ausgeführt
  {$ELSEIF LibVersion = 2.0}
    Writeln(5);  // Dieser Code wird nicht ausgeführt
  {$ELSE}
    Writeln;  // Dieser Code wird nicht ausgeführt
  {$IFEND}
  {$IF Declared(Test)}
    Writeln('Success'); // Erfolg
  {$IFEND}
...
end.

Die speziellen Funktionen Defined und Declared können nur in $IF- und $ELSEIF-Blöcken verwendet werden. Defined gibt True zurück, wenn als Argument ein definiertes bedingtes Symbol übergeben wird. Declared gibt True zurück, wenn als Argument ein gültiger deklarierter Object Pascal-Bezeichner übergeben wird, der im aktuellen Gültigkeitsbereich sichtbar ist.

Wenn die im bedingten Ausdruck referenzierten Bezeichner nicht vorhanden sind, wird die Bedingung als False ausgewertet:

  {$IF NoSuchVariable > 5}
    Writeln('This line doesn''t compile');
  {$IFEND}

Sie können in einer IF-Direktive die Konstante FireMonkeyVersion (ist in FMX.Types.pas definiert und entspricht 16.1 im XE2 Update 2) verwenden. Um beispielsweise FireMonkey-Code für eine höhere Version als 16.0 auszuweisen und zu unterscheiden, schließen Sie den Code in die folgende bedingte Direktive ein:

  {$IF Declared(FireMonkeyVersion) and (FireMonkeyVersion > 16.0)}
    ...
  {$IFEND}

Die Direktiven $IF und $ELSEIF werden im Gegensatz zu anderen bedingten Direktiven, die mit $ENDIF beendet werden, durch $IFEND abgeschlossen. Dadurch können die $IF-Blöcke der früheren Compiler-Versionen (die $IF oder $ELSEIF nicht unterstützen) verborgen werden, indem sie in $IFDEF-Blöcke eingeschlossen werden. So führt beispielsweise folgendes Konstrukt nicht zu einem Compiler-Fehler:

  {$UNDEF NewEdition}
  {$IFDEF NewEdition}
    {$IF LibVersion > 2.0}
      ...
    {$IFEND}
  {$ENDIF}

$IF unterstützt zwar die Auswertung typisierter Konstanten, der Compiler lässt diese aber nicht in konstanten Ausdrücken zu. Daher ist

  const Test: Integer = 5;
  {$IF SizeOf(Test) > 2}
    ...

gültig, aber

  const Test: Integer = 5;
  {$IF Test > 2 }         // Fehler
    ...

führt zu einem Compilierungsfehler.

Wenn Ihr Quelltext zwischen den verschiedenen Versionen von Object Pascal oder anderen Plattformen (wie z.B. .NET) portierbar sein soll, müssen Sie testen, ob diese Direktive vom Compiler unterstützt wird. Schließen Sie den Quelltext dazu in folgende Direktiven ein:

  {$IFDEF conditionalexpressions}
    .          // Code mit IF-Direktive
    .          // Wird nur ausgeführt, wenn unterstützt
  {$ENDIF}

Siehe auch