条件付きコンパイル(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 以降 |
DCCOSX64 10.3 Rio リリース 2 以降 |
DCCAARM XE5 にて |
DCCIOSARM64 XE8 以降 |
DCCLINUX64 10.2 Tokyo 以降 |
DCCAARM64 10.3 Rio リリース 3 以降 |
DCCOSXARM64 11.0 Alexandria リリース以降 |
DCCIOSSIMARM64 11.2 Alexandria リリース以降 |
コメント |
---|---|---|---|---|---|---|---|---|---|---|---|
コンパイラ | DCC | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | |
VER340 コンパイラ バージョンの一覧については、「コンパイラ バージョン」を参照。 |
定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | Delphi Sydney の場合、コンパイラ バージョン 34.0 には VER340 が定義されています。
| |
プラットフォーム | CONSOLE | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | アプリケーションがコンソール アプリケーションとしてコンパイルされる場合に定義されます。 |
IOS | 未定義 | 未定義 | 未定義 | なし | 定義済み | 未定義 | 未定義 | 未定義 | 定義済み | ターゲット プラットフォームが iOS の場合に定義されます。 XE4/iOS で新規導入。 | |
IOS64 | 未定義 | 未定義 | 未定義 | 未定義 | 定義済み | 未定義 | 未定義 | 未定義 | 定義済み | ターゲット プラットフォームが iOS64 の場合に定義されます。 XE8/iOSarm64 以降。 | |
OSX | 未定義 | 未定義 | 定義済み | 未定義 | 未定義 | 未定義 | 未定義 | 定義済み | 未定義 | ターゲット プラットフォームが macOS の場合に定義されます。 XE2/macOS で新規導入。 | |
OSX64 | 未定義 | 未定義 | 定義済み | 未定義 | 未定義 | 未定義 | 未定義 | 定義済み | 未定義 | ターゲット プラットフォームが macOS の場合に定義されます。 10.3.2 で新規導入。 | |
NATIVECODE | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | Delphi.Net 以降 | |
MSWINDOWS | 定義済み | 定義済み | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | オペレーティング環境が Windows であることを示します。種類を問わず Windows プラットフォームかどうかを検査する場合は、WIN32 ではなく MSWINDOWS を使用します。 | |
Win32 | 定義済み | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | ターゲット プラットフォームが 32 ビット ネイティブ Windows プラットフォームであることを示します。 | |
Win64 | 未定義 | 定義済み | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | ターゲット プラットフォームが 64 ビット Windows であることを示します。 XE2/x64 で新規導入。 | |
MACOS | 未定義 | 未定義 | 定義済み | 未定義 | 定義済み | 未定義 | 未定義 | 定義済み | 定義済み | ターゲット プラットフォームは Apple Darwin OS(macOS または iOS)です。 メモ: このシンボルは、Apple が名前を OS X から macOS に変更する前から存在します。 XE2/macOS で新規導入。
| |
MACOS32 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | ターゲット プラットフォームは、32 ビット Apple Darwin OS(32 ビット macOS または 32 ビット iOS)です。 メモ: このシンボルは、Apple が名前を OS X から macOS に変更する前から存在します。 XE2/macOS で新規導入。
| |
MACOS64 | 未定義 | 未定義 | 定義済み | 未定義 | 定義済み | 未定義 | 未定義 | 定義済み | 定義済み | ターゲット プラットフォームは、64 ビット Apple Darwin OS(64 ビット macOS または 64 ビット iOS)です。 メモ: このシンボルは、Apple が名前を OS X から macOS に変更する前から存在します。 XE8/macOS で新規導入。
| |
Linux | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 定義済み | 未定義 | 未定義 | 未定義 | Kylix 以降。 | |
LINUX32 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | Kylix 以降。 | |
LINUX64 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 定義済み | 未定義 | 未定義 | 未定義 | 10.2 における新機能 | |
POSIX | 未定義 | 未定義 | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | Kylix 以降。 | |
POSIX32 | 未定義 | 未定義 | 未定義 | 定義済み | 定義済み | 未定義 | 未定義 | 未定義 | 未定義 | Kylix 以降。 | |
POSIX64 | 未定義 | 未定義 | 定義済み | 未定義 | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | Kylix 以降。 | |
Android | 未定義 | 未定義 | 未定義 | 定義済み | 未定義 | 未定義 | 定義済み | 未定義 | 未定義 | ターゲット プラットフォームが Android の場合に定義されます。 XE5 で新規導入。 | |
ANDROID32 | 未定義 | 未定義 | 未定義 | 定義済み | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | XE8/iOSarm64 以降。 | |
ANDROID64 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 定義済み | 未定義 | 未定義 | Android 64 ビット プラットフォーム用の Delphi コンパイラ 10.3.3 で新規導入。 | |
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 | 未定義 | 未定義 | 未定義 | 定義済み | 定義済み | 未定義 | 定義済み | 定義済み | 定義済み | Defined if the CPU is based on the ARM architecture.. *New* in XE4/iOS. | |
CPUARM32 | 未定義 | 未定義 | 未定義 | 定義済み | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | The CPU is in a 32-bit ARM environment. *New* in XE8. | |
CPUARM64 | 未定義 | 未定義 | 未定義 | 未定義 | 定義済み | 未定義 | 定義済み | 定義済み | 定義済み | CPU が 64 ビット ARM 環境にあることを示します(たとえば、DCCIOSARM64.EXE などの場合)。 XE8 で新規導入。 | |
可用性 | ALIGN_STACK | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 厳密なスタック アライメント要件がない、macOS コンパイラや、Linux などの他のプラットフォームの他のコンパイラと共有できるコードで定義されます。詳細については、Eli Boling のブログ(http://blogs.embarcadero.com/eboling/2009/05/20/5607)を参照してください。 XE2/macOS で新規導入。 |
ASSEMBLER | 定義済み | 定義済み | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | アセンブラ構文を使用できることを示します。 | |
AUTOREFCOUNT (*) | 未定義 | 未定義 | 定義済み | 定義済み | 定義済み | 未定義 | 10.2 では定義済み 10.3 以降、未定義 |
未定義 | 未定義 | Delphi モバイル コンパイラなど、自動参照カウント機能を使用するコンパイラの場合に定義されます。 XE4/iOS で新規導入。 10.4 Sydney で削除。 | |
EXTERNALLINKER | 未定義 | 未定義 | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 外部リンカと LLVM コード ジェネレータのあるコンパイラの場合に定義されます。Delphi モバイル コンパイラの場合は外部リンカ ld があり、LLVM をコード ジェネレータとして使用します。 XE4/iOS で新規導入。 | |
UNICODE | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | UNICODE はデフォルトの文字列型として定義されます。 | |
CONDITIONALEXPRESSIONS | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | $IF 指令が使用可能かどうかを検査します。 | |
ELF | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 定義済み | 未定義 | 未定義 | 未定義 | 実行可能ファイルおよびリンク可能形式ファイル(ELF)を対象とする際、定義されます。 | |
NEXTGEN (*) | 未定義 | 未定義 | 定義済み | 定義済み | 定義済み | 10.2 では定義済み 10.3 以降、未定義 |
未定義 | 未定義 | 未定義 | インデックスが 0 から始まる文字列などの "次世代" 言語機能を使用している(Delphi モバイル コンパイラなどの)コンパイラの場合に定義されます。 XE4/iOS で新規導入。 10.4 Sydney で削除。 | |
PC_MAPPED_EXCEPTIONS | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 例外のアンワインドにスタック フレームワークではなくアドレス マップを使用するプラットフォーム(たとえば macOS など)を現在のプラットフォームまたはターゲット プラットフォームとしてコンパイルする場合に定義されます。 XE2 で新規導入。 | |
PIC | 対象外 | 対象外 | 常に定義済み | 常に定義済み | 常に定義済み | 常に定義済み | 常に定義済み | 常に定義済み | 常に定義済み | 位置独立コード(PIC)が必要なプラットフォーム(たとえば macOS など)の場合に定義されます。 | |
UNDERSCOREIMPORTNAME | 定義済み | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | 未定義 | (たとえば、Mac OS からインポートされたダイナミック ライブラリの名前などの)先頭にアンダースコアを付けるコンパイラの場合に定義されます。 XE4/iOS で新規導入。 | |
WEAKREF | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 弱い参照([weak] 属性)を使用できるコンパイラの場合に定義されます。 XE4/iOS で新規導入。 | |
WEAKINSTREF (*) | 定義済み | 定義済み | 未定義 | 未定義 | 未定義 | 定義済み | 未定義 | 定義済み | 定義済み | 弱い参照がインスタンスに定義される場合に定義されます。 XE4/iOS で新規導入。 10.4 Sydney で削除。 | |
WEAKINTFREF | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 定義済み | 弱い参照がインターフェイスに定義される場合に定義されます。 XE4/iOS で新規導入。 |
上記表の列見出しで、
- DCC32 は Windows 版 32 ビット Delphi コンパイラです。
- DCC64 は Windows 版 64 ビット Delphi コンパイラです。
- DCCOSX64 は、64 ビット macOS Delphi コンパイラです。
- DCCAARM は、Android デバイス用の Delphi コンパイラです。
- DCCIOSARM64 は 64 ビット iOS デバイス用の Delphi コンパイラです。
- DCCLINUX64 は 64 ビット Linux Delphi コンパイラです。
- DCCAARM64 は、64 ビット Android デバイス用の Delphi コンパイラです。
- DCCOSXARM64 は、64 ビット macOS プラットフォームの Delphi コンパイラです。
- DCCIOSSIMARM64 は、64 ビット ARM iOS シミュレータ用 Delphi コンパイラです。
フレームワーク条件変数
次の条件は、RAD Studio 11.1 より利用可能です:
カテゴリ | シンボル | コメント |
---|---|---|
フレームワーク | FRAMEWORK_VCL | プロジェクトが VCL フレームワークを使用するかを定義。 |
FRAMEWORK_FMX | プロジェクトが FMX フレームワークを使用するかを定義。 |
コンパイラ バージョンを表す条件シンボルの使用
たとえば、コードのコンパイルに使用されるコンパイラやランタイム ライブラリのバージョンを判定するには、以下のように、{$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 は、ランタイム ライブラリのバージョンとして定義される定数です。Sydney の場合、RTLVersion は 34 です。
- System.CompilerVersion は、現在の Delphi コンパイラのバージョンとして定義される定数です。Sydney の場合、CompilerVersion は 34 です。
- FMX.Types.FireMonkeyVersion は、現在の FireMonkey ライブラリのバージョンとして定義される定数です。Sydney の場合、FireMonkeyVersion は 270 です。
関連項目
- Delphi コンパイラ指令のリスト:インデックス
- コンパイラ バージョン
- CompilerVersion(Delphi)コード例
- IF 指令 (Delphi) と IFEND 指令 (Delphi)
- IFDEF 指令 (Delphi) と ENDIF 指令 (Delphi)
- 宣言と文(Delphi)
- Delphi コンパイラ
- [Delphi コンパイラ]ページ([<プロジェクト名> のプロジェクト オプション]内)