条件付きコンパイル(Delphi)

提供: RAD Studio
移動先: 案内検索

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}
メモ: 条件シンボルは Delphi の識別子ではなく、実際のプログラム コードで参照することはできません。 同様に、Delphi の識別子を {$IF}{$ELSEIF} 以外の条件指令で参照することはできません。
メモ: 条件定義は、ソース コードの再コンパイル時にのみ評価されます。 条件シンボルの状態を変更してからプロジェクトを再構築しても、変更のないユニットのソース コードは再コンパイルされない可能性があります。 プロジェクト内のすべてのものに条件シンボルの現在の状態を確実に反映させるには、[プロジェクト|すべてのプロジェクトをビルド] を使用します。
メモ: [プロジェクト|オプション...|Delphi コンパイラ で、条件定義の名前を変更した場合、変更を反映させるためには、プロジェクトをビルドする([プロジェクト|<ProjectName> をビルド、または、Shift + F9)必要があります。

条件指令構文は、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 定義済み 定義済み 定義済み 定義済み 定義済み 定義済み 定義済み 定義済み 定義済み
VER360
コンパイラ バージョンの一覧については、「コンパイラ バージョン」を参照。
定義済み 定義済み 定義済み 定義済み 定義済み 定義済み 定義済み 定義済み 定義済み Delphi Athens の場合、コンパイラ バージョン 36.0 には VER360 が定義されています。
プラットフォーム 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 で新規導入。


注意: アスタリスク(*)がついたシンボルは、過去に Delphi モバイル コンパイラで定義されていましたが、RAD Studio 10.4 Sydney で、ARC メモリ モデルの削除の一環で削除されました。

上記表の列見出しで、

  • 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}CompilerVersionRTLVersion などの定数と共に使用できます。

 {$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 は、ランタイム ライブラリのバージョンとして定義される定数です。Athens の場合、RTLVersion は 36 です。
  • System.CompilerVersion は、現在の Delphi コンパイラのバージョンとして定義される定数です。Athens の場合、CompilerVersion は 36 です。
  • FMX.Types.FireMonkeyVersion は、現在の FireMonkey ライブラリのバージョンとして定義される定数です。Athens の場合、FireMonkeyVersion は 290 です。

関連項目