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); // 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}