条件付きコンパイル(Delphi)
Delphi コンパイラ指令のリスト:インデックス への移動
条件付きコンパイルは、定数の存在と評価、コンパイラ スイッチの状態、および条件シンボルの定義に基づいて行われます。
条件シンボルは論理型変数のような働きをします。つまり、定義済み(True)か未定義(False)のどちらかです。有効な条件シンボルはすべて、定義されるまでは False と見なされます。
条件シンボルの定義方法は以下の 3 とおりあります。
{$DEFINE}
指令を使用して指定のシンボルを True に設定し、{$UNDEF}
指令を使用して指定のシンボルを False に設定する。- コマンドライン コンパイラで
-D
スイッチを使用する(この選択肢はすべての Delphi コンパイラでサポートされています)。 - [プロジェクト|オプション...|Delphi コンパイラ] ページの[条件定義] フィールドにシンボルを追加する。
条件指令 {$IFDEF}
、{$IFNDEF}
、{$IF}
、{$ELSEIF}
、{$ELSE}
、{$ENDIF}
、{$IFEND}
を使用すると、コードをコンパイルするかどうかを条件シンボルの状態に基づいて制御できます。{$IF}
と {$ELSEIF}
を使用すると、Delphi の宣言済み識別子に基づいて条件付きコンパイルを行うことができます。{$IFOPT} を使用すると、指定されたコンパイラ スイッチが有効かどうかで、コードをコンパイルするかどうかを制御できます。
たとえば、次の Delphi コード断片は、DEBUG 条件定義が設定されている({$DEFINE DEBUG}
)かどうかによって、処理が異なります。
{$DEFINE DEBUG}
{$IFDEF DEBUG}
Writeln('Debug is on.'); // This code executes.
{$ELSE}
Writeln('Debug is off.'); // This code does not execute.
{$ENDIF}
{$UNDEF DEBUG}
{$IFNDEF DEBUG}
Writeln('Debug is off.'); // This code executes.
{$ENDIF}
{$IF}
と {$ELSEIF}
以外の条件指令で参照することはできません。条件指令構文は、32 レベルの深さまでネストすることができます。{$IFxxx}
ごとに、対応する {$ENDIF}
または {$IFEND}
が、同じソース ファイル内に存在しなければなりません。条件シンボルは、英文字で始まり、その後は英文字、数字、アンダースコア(_)の任意の組み合わせでなければなりません。長さに制限はありませんが、先頭の 255 文字のみ有効です。
定義済みの条件シンボル
以下の条件シンボルが標準で定義されています。
カテゴリ | シンボル | DCC32 | DCC64 XE2 以降 |
DCCOSX XE2 以降 |
DCCIOSARM XE3 以降 |
DCCIOS32 XE3 以降 |
DCCAARM |
DCCIOSARM64 XE8 以降 |
DCCLINUX64 10.2 Tokyo 以降 |
コメント |
---|---|---|---|---|---|---|---|---|---|---|
コンパイラ | DCC | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | |
VER330 コンパイラ バージョンの一覧については、「コンパイラ バージョン」を参照。 |
定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | Delphi Rio の場合、コンパイラ バージョン 33.0 には、VER330 が定義されています。
| |
プラットフォーム | CONSOLE | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | アプリケーションがコンソール アプリケーションとしてコンパイルされる場合に定義されます。 |
IOS | 未定義 | 未定義 | 未定義 | 定義済み | 定義済み | 該当なし | 定義済み | 未定義 | ターゲット プラットフォームが iOS の場合、定義済み。 XE4/iOS で新規導入。 | |
IOS32 | 未定義 | 未定義 | 未定義 | 定義済み | 定義済み | 未定義 | 未定義 | 未定義 | ターゲット プラットフォームが iOS32 かどうかを定義。 XE8/iOSarm64 以降 | |
IOS64 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 定義済み | 未定義 | ターゲット プラットフォームが iOS64 かどうかを定義。 XE8/iOSarm64 以降 | |
NATIVECODE | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | Delphi.Net 以降 | |
MSWINDOWS | 定義済み | 定義済み | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | オペレーティング環境が Windows であることを示します。種類を問わず Windows プラットフォームかどうかを検査する場合は、WIN32 ではなく MSWINDOWS を使用します。 | |
Win32 | 定義済み | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | ターゲット プラットフォームが 32 ビット ネイティブ Windows プラットフォームであることを示します。 | |
Win64 | 未定義 | 定義済み | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | ターゲット プラットフォームが 64 ビット Windows であることを示します。 XE2/x64 で新規導入。 | |
MACOS | 未定義 | 未定義 | 定義済み | 定義済み | 定義済み | 未定義 | 定義済み | 未定義 | ターゲット プラットフォームが OS X であることを示します。 XE2/OSX で新規導入。 | |
MACOS32 | 未定義 | 未定義 | 定義済み | 定義済み | 定義済み | 未定義 | 未定義 | 未定義 | ターゲット プラットフォームが 32 ビット OS X であることを示します。 XE2/OSX で新規導入。 | |
MACOS64 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 定義済み | 未定義 | ターゲット プラットフォームが 64 ビット OS X であることを示します。 XE8/OSX で新規導入。 | |
Linux | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 定義済み | Kylix 以降 | |
LINUX32 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | Kylix 以降 | |
LINUX64 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 定義済み | 10.2 における新機能 | |
POSIX | 未定義 | 未定義 | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | Kylix 以降 | |
POSIX32 | 未定義 | 未定義 | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 未定義 | Kylix 以降 | |
POSIX64 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 定義済み | 定義済み | Kylix 以降 | |
Android | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 定義済み | 未定義 | 未定義 | ターゲット プラットフォームが Android の場合、定義済み。 XE5 で新規導入。 | |
ANDROID32 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 定義済み | 未定義 | 未定義 | XE8/iOSarm64 以降 | |
CPU | CPU386 | 定義済み | 未定義 | 定義済み | 未定義 | 定義済み | 未定義 | 未定義 | 未定義 | CPU が Intel 386 以上であることを示します。 |
CPUX86 | 定義済み | 未定義 | 定義済み | 未定義 | 定義済み | 未定義 | 未定義 | 未定義 | CPU が任意のプラットフォーム上の Intel 386 以上であることを示します。 XE2/x64 で新規導入。 | |
CPUX64 | 未定義 | 定義済み | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 定義済み | CPU が x86-64 命令セットをサポートし、64 ビット環境にあることを示します。 XE2/x64 で新規導入。 | |
CPU32BITS | 定義済み | 未定義 | 定義済み | 定義済み | 定義済み | 定義済み | 未定義 | 未定義 | CPU が 32 ビット環境にあることを示します(たとえば、DCC32.EXE などの場合)。 XE8 での新規機能 | |
CPU64BITS | 未定義 | 定義済み | 未定義 | 未定義 | 未定義 | 未定義 | 定義済み | 定義済み | CPU が 64 ビット環境にあることを示します(たとえば、DCC64.EXE などの場合)。 XE8 での新規機能 | |
CPUARM | 未定義 | 未定義 | 未定義 | 定義済み | 未定義 | 定義済み | 定義済み | 未定義 | iOS デバイス用の Delphi モバイル コンパイラ(DCCIOSARM.EXE)などのように、CPU が ARM アーキテクチャに基づいている場合に定義されます。 XE4/iOS で新規導入。 | |
CPUARM32 | 未定義 | 未定義 | 未定義 | 定義済み | 未定義 | 定義済み | 未定義 | 未定義 | CPU が 32 ビット ARM 環境にあることを示します(たとえば、DCCIOSARM.EXE などの場合)。 XE8 で新規導入。 | |
CPUARM64 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 定義済み | 未定義 | CPU が 64 ビット ARM 環境にあることを示します(たとえば、DCCIOSARM64.EXE などの場合)。 XE8 で新規導入。 | |
機能の有無 | ||||||||||
ALIGN_STACK | 未定義 | 未定義 | 定義済み | 未定義 | 定義済み | 未定義 | 未定義 | 未定義 | 厳密なスタック アラインメント要件がないプラットフォーム(Linux など)の別コンパイラ、および OS X コンパイラと共有できるコードで定義します。詳細は、Eli Boling のブログ http://blogs.embarcadero.com/eboling/2009/05/20/5607 を参照。 XE2/OSX で新規導入。 | |
ASSEMBLER | 定義済み | 定義済み | 定義済み | 未定義 | 定義済み | 未定義 | 未定義 | 未定義 | アセンブラ構文を使用できることを示します。 | |
AUTOREFCOUNT | 未定義 | 未定義 | 未定義 | 定義済み | 定義済み | 定義済み | 定義済み | 10.2 では定義済み 10.3 以降、未定義 |
Delphi モバイル コンパイラなど、自動参照カウント機能を使用するコンパイラの場合に定義されます。 XE4/iOS で新規導入。 | |
EXTERNALLINKER | 未定義 | 未定義 | 未定義 | 定義済み | 未定義 | 定義済み | 定義済み | 定義済み | 外部リンカと LLVM コード ジェネレータのあるコンパイラの場合に定義されます。Delphi モバイル コンパイラの場合は外部リンカ ld があり、LLVM をコード ジェネレータとして使用します。 XE4/iOS で新規導入。 | |
UNICODE | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | UNICODE はデフォルトの文字列型として定義されます。 | |
CONDITIONALEXPRESSIONS | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | $IF 指令が使用可能かどうかを検査します。 | |
ELF | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 定義済み | 実行可能ファイルおよびリンク可能形式ファイル(ELF)を対象とする際、定義されます。 | |
NEXTGEN | 未定義 | 未定義 | 未定義 | 定義済み | 定義済み | 定義済み | 定義済み | 10.2 では定義済み 10.3 以降、未定義 |
インデックスが 0 から始まる文字列などの "次世代" 言語機能を使用している(Delphi モバイル コンパイラなどの)コンパイラの場合に定義されます。 XE4/iOS で新規導入。 | |
PC_MAPPED_EXCEPTIONS | 未定義 | 未定義 | 定義済み | 未定義 | 定義済み | 未定義 | 未定義 | 未定義 | 例外のアンワインドにスタック フレームワークではなくアドレス マップを使用するプラットフォーム(たとえば OS X など)を現在のプラットフォームまたはターゲット プラットフォームとしてコンパイルする場合に定義されます。 XE2 で新規導入。 | |
PIC | 対象外 | 対象外 | 常に定義済み | 常に定義済み | 常に定義済み | 常に定義済み | 常に定義済み | 常に定義済み | 位置独立コード(PIC)が必要なプラットフォーム(たとえば OS X など)の場合に定義されます。 | |
UNDERSCOREIMPORTNAME | 定義済み | 未定義 | 定義済み | 未定義 | 定義済み | 未定義 | 未定義 | 未定義 | (たとえば、Mac OS からインポートされたダイナミック ライブラリの名前などの)先頭にアンダースコアを付けるコンパイラの場合に定義されます。 XE4/iOS で新規導入。 | |
WEAKREF | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 弱い参照([Weak] 属性)を使用できるコンパイラの場合に定義されます。XE4/iOS で新規導入。 | |
WEAKINSTREF | 未定義 | 未定義 | 未定義 | 定義済み | 定義済み | 定義済み | 定義済み | 10.2 では定義済み 10.3 以降、未定義 |
弱い参照がインスタンスに定義される場合に定義されます。 XE4/iOS で新規導入。 | |
WEAKINTFREF | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 弱い参照がインターフェイスに定義される場合に定義されます。 XE4/iOS で新規導入。 |
上記表の列見出しで、
- DCC32 は Windows 版 32 ビット Delphi コンパイラです。
- DCC64 は Windows 版 64 ビット Delphi コンパイラです。
- DCCOSX は、OS X Delphi コンパイラです。
- DCCIOSARM は 32 ビット iOS デバイス用の Delphi コンパイラです。
- DCCIOS32 は iOS シミュレータ用の Delphi コンパイラです。
- DCCAARM.EXE は Android デバイス用の Delphi コンパイラです。
- DCCIOSARM64 は 64 ビット iOS デバイス用の Delphi コンパイラです。
- DCCLINUX64 は 64 ビット Linux Delphi コンパイラです。
コンパイラ バージョンを表す条件シンボルの使用
たとえば、コードのコンパイルに使用されるコンパイラやランタイム ライブラリのバージョンを判定するには、以下のように、{$IF}
を CompilerVersion や RTLVersion などの定数と共に使用できます。
{$IFDEF CONDITIONALEXPRESSIONS}
{$IF CompilerVersion >= 17.0}
{$DEFINE HAS_INLINE}
{$IFEND}
{$IF RTLVersion >= 14.0}
{$DEFINE HAS_ERROUTPUT}
{$IFEND}
{$ENDIF}
リリースされているさまざまな Delphi コンパイラとそれらに関連付けられているバージョン番号の一覧については、コンパイラ バージョンの一覧表を参照してください。
定義済みの定数
定数は、Delphi のプログラム コードで使用できるため、条件シンボルよりも効果的な場合があります。それに対して、条件シンボルは、{$IF}
や {$IFDEF}
などの条件コンパイル指令の中でのみ使用できます。
以下の 3 つの重要な定数が用意されています。
- System.RTLVersion は、ランタイム ライブラリのバージョンとして定義される定数です。Rio の場合、RTLVersion は 33 です。
- System.CompilerVersion は、現在の Delphi コンパイラのバージョンとして定義される定数です。Rio の場合、CompilerVersion は 33 です。
- FMX.Types.FireMonkeyVersion は、現在の FireMonkey ライブラリのバージョンとして定義される定数です。Rio の場合、FireMonkeyVersion は 260 です。
関連項目
- Delphi コンパイラ指令のリスト:インデックス
- コンパイラ バージョン
- CompilerVersion(Delphi)コード例
- IF 指令 (Delphi) と IFEND 指令 (Delphi)
- IFDEF 指令 (Delphi) と ENDIF 指令 (Delphi)
- 宣言と文(Delphi)
- Delphi コンパイラ
- [Delphi コンパイラ]ページ([<プロジェクト名> のプロジェクト オプション]内)