IF 指令(Object Pascal)

提供: Appmethod Topics
移動先: 案内検索

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


種類

条件コンパイル

構文

{$IF expression}

説明

expressionTrue の場合に、後続の Object Pascal ソース コードをコンパイルします。 expression は Object Pascal 構文に準拠し、論理値を返す必要があります。この式には、宣言済み定数、定数式、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 は、渡された引数が現在のスコープ内に現れる有効な宣言済み Object Pascal 識別子である場合に 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 } // エラー
 ...

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

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

 {$IFDEF conditionalexpressions}
 . // IF 指令を含むコード
 . // サポートされている場合のみ実行される
 {$ENDIF}

関連項目