IF-Direktive (Delphi)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Liste der Delphi-Compiler-Direktiven - Index


Typ

Bedingte Compilierung

Syntax

{$IF Ausdruck}

Anmerkungen

Der nachfolgende Delphi-Quelltext wird compiliert, wenn Ausdruck True ist. Ausdruck muss der Delphi-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);  // this code does not execute
  {$IFEND}
  {$IF Defined(MY_DEFINE) }
    Writeln(3);  // this code executes
  {$ELSEIF LibVersion > 2.0}
    Writeln(4);  // this code does not execute
  {$ELSEIF LibVersion = 2.0}
    Writeln(5);  // this code does not execute
  {$ELSE}
    Writeln;  // this code does not execute
  {$IFEND}
  {$IF Declared(Test)}
    Writeln('Success'); // successful
  {$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. Für Declared kann nur ein Symbol oder Typ als Parameter übergeben werden, kein zusammengesetztes Symbol (wie ein Feld einer Datenstruktur). Die Funktion gibt True zurück, wenn als Argument ein gültiger deklarierter Delphi-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 verwenden (ist in FMX.Types.pas definiert und entspricht 16.1 im XE2 Update 2). 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 mit $IFEND anstatt mit $ENDIF abgeschlossen. Dadurch können Sie die $IF-Blöcke der früheren Compiler-Versionen verbergen (die $IF oder $ELSEIF nicht unterstützen), indem Sie sie in $IFDEF-Blöcke einschließen. 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 }         // error
    ...

führt zu einem Compilierungsfehler.

Wenn Ihr Quelltext zwischen den verschiedenen Versionen von Delphi 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 including IF directive
    .          // only executes if supported
  {$ENDIF}

Siehe auch