IF 指令(Delphi)

提供: RAD Studio
移動先: 案内検索

Delphi コンパイラ指令のリスト:インデックス への移動


種類

条件コンパイル

構文

{$IF expression}

説明

expressionTrue の場合、後続の Delphi ソース コードをコンパイルします。expression は Delphi 構文に準拠し、ブーリアン値を返す必要があります。 この式には、宣言済みの定数、定数式、Defined 関数、Declared 関数を含めることができます。

次に例を示します:

 
...
{$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.

特殊関数 Defined および Declared は、$IF ブロックと $ELSEIF ブロック内でのみ使用することができます。 Defined は、渡された引数が定義済みの条件シンボルである場合に True を返します。Declared の場合、パラメーターとして渡すことができるのは、シンボルまたは型のみであり、複合シンボル(データ構造型のフィールドなど)は渡すことができません。渡された引数が現在のスコープ内に現れる有効な宣言済み Delphi 識別子である場合に、True を返します。

条件式で参照される識別子が存在しない場合、条件式は False として評価されます:

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

IF 指令では FireMonkeyVersion 定数(FMX.Types.pas で定義されており、XE2 Update 2 リリース時の 16.1 に等しい)を使用できます。16.0 より後のバージョンの FireMonkey コードを特定して分離するには、次のような条件指令でコードを囲みます:

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

$ENDIF で終了する他の条件指令とは異なり、$IF 指令と $ELSEIF 指令は $IFEND で終了します。 これにより、$IF ブロックを従来の形式の $IFDEF ブロック内にネストすることで、($IF や $ELSEIF をサポートしていない)以前のバージョンのコンパイラに $IF ブロックを無視させることができます。 たとえば、以下のコードをコンパイルしてもエラーは発生しません。

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

$IF では型付き定数の評価をサポートしていますが、コンパイラでは定数式内での型付き定数の使用を許可しません。 その結果、

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

上記のコードは有効ですが、

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

これは、コンパイル エラーになります。

コードを Delphi のさまざまなバージョン間または異なるプラットフォーム(.NET など)間で移植可能にする必要がある場合は、この指令がコンパイラでサポートされているかどうかを検査する必要があります。 それには、コードを次のような指令で囲みます。

  {$IFDEF conditionalexpressions}
    .          // code including IF directive
    .          // only executes if supported
  {$ENDIF}

関連項目