IF 指令(Delphi)
Delphi コンパイラ指令のリスト:インデックス への移動
種類 |
条件コンパイル |
構文 |
{$IF expression} |
説明
expression が True の場合に、後続の 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); // このコードは実行されない
{$IFEND}
{$IF Defined(MY_DEFINE) }
Writeln(3); // このコードは実行される
{$ELSEIF LibVersion > 2.0}
Writeln(4); // このコードは実行されない
{$ELSEIF LibVersion = 2.0}
Writeln(5); // このコードは実行されない
{$ELSE}
Writeln; // このコードは実行されない
{$IFEND}
{$IF Declared(Test)}
Writeln('Success'); // 成功
{$IFEND}
...
end.
特殊関数 Defined および Declared は、$IF ブロックと $ELSEIF ブロック内でのみ使用することができます。 Defined は、渡された引数が定義済みの条件シンボルである場合に true を返します。 Declared は、渡された引数が現在のスコープ内に現れる有効な宣言済み Delphi 識別子である場合に true を返します。
条件式で参照されている識別子が存在しない場合、条件式は false として評価されます:
{$IF NoSuchVariable > 5}
Writeln('This line doesn''t compile');
{$IFEND}
F 指令では、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 } // エラー
...
これは、コンパイルエラーになります。
コードを Delphi のさまざまなバージョン間または異なるプラットフォーム(.NET など)間で移植可能にする必要がある場合は、この指令がコンパイラでサポートされているかどうかを検査する必要があります。 それには、コードを次のような指令で囲みます:
{$IFDEF conditionalexpressions}
. // IF 指令を含むコード
. // サポートされている場合のみ実行される
{$ENDIF}