表示: Delphi C++
表示設定

条件付きコンパイル(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 コンパイラで条件定義の名前を変更した場合、変更内容を有効にするには、プロジェクトをビルドする([プロジェクト|<プロジェクト名> をビルド]を選択するか Shift + F9 キーを押す)必要があります。

条件指令構文は、32 レベルの深さまでネストすることができます。{$IFxxx} ごとに、対応する {$ENDIF} または {$IFEND} が、同じソース ファイル内に存在しなければなりません。条件シンボルは、英文字で始まり、その後は英文字、数字、アンダースコア(_)の任意の組み合わせでなければなりません。長さに制限はありませんが、先頭の 255 文字のみ有効です。

定義済みの条件シンボル

以下の条件シンボルが標準で定義されています。

カテゴリ シンボル DCC32   DCC64  
  XE2 以降  
  DCCOSX  
  XE2 以降  
  DCCIOSARM  
  XE3 以降  
  DCCIOS32  
  XE3 以降  

    DCCAARM  
XE5 にて

  DCCIOSARM64  
  XE8 以降  
コメント
コンパイラ DCC 定義済み 定義済み 定義済み 定義済み 定義済み 定義済み 定義済み
VER310

コンパイラ バージョンの一覧については、「コンパイラ バージョン」を参照。
定義済み 定義済み 定義済み 定義済み 定義済み 定義済み 定義済み Delphi XE8 の場合、コンパイラ バージョン 29.0 には、VER310 が定義されています。
プラットフォーム CONSOLE 定義済み 定義済み 定義済み 定義済み 定義済み 定義済み 定義済み アプリケーションがコンソール アプリケーションとしてコンパイルされる場合に定義されます。
IOS 未定義 未定義 未定義 定義済み 定義済み 該当なし 定義済み ターゲット プラットフォームが iOS の場合、定義済み。
XE4/iOS で新規導入。
NATIVECODE 定義済み 定義済み 定義済み 定義済み 定義済み 定義済み 定義済み Delphi.Net 以降
MSWINDOWS 定義済み 定義済み 未定義 未定義 未定義 未定義 未定義 オペレーティング環境が Windows であることを示します。種類を問わず Windows プラットフォームかどうかを検査する場合は、WIN32 ではなく MSWINDOWS を使用します。
Win32 定義済み 未定義 未定義 未定義 未定義 未定義 未定義 ターゲット プラットフォームが 32 ビット ネイティブ Windows プラットフォームであることを示します。
Win64 未定義 定義済み 未定義 未定義 未定義 未定義 未定義 ターゲット プラットフォームが 64 ビット Windows であることを示します。
XE2/x64 で新規導入。
MACOS 未定義 未定義 定義済み 定義済み 定義済み 未定義 未定義 ターゲット プラットフォームが Mac OS X であることを示します。
XE2/OSX で新規導入。
MACOS32 未定義 未定義 定義済み 定義済み 定義済み 未定義 未定義 ターゲット プラットフォームが 32 ビット Mac OS X であることを示します。
XE2/OSX で新規導入。
Linux 未定義 未定義 未定義 未定義 未定義 未定義 未定義 Kylix 以降
LINUX32 未定義 未定義 未定義 未定義 未定義 未定義 未定義 Kylix 以降
POSIX 未定義 未定義 定義済み 定義済み 定義済み 定義済み 定義済み Kylix 以降
POSIX32 未定義 未定義 定義済み 定義済み 定義済み 定義済み 定義済み Kylix 以降
Android 未定義 未定義 未定義 未定義 未定義 定義済み 未定義 ターゲット プラットフォームが Android の場合、定義済み。
XE5 で新規導入。
CPU CPUARM 未定義 未定義 未定義 定義済み 未定義 定義済み 定義済み iOS デバイス用の Delphi モバイル コンパイラ(DCCIOSARM.EXE)などのように、CPU が ARM アーキテクチャに基づいている場合に定義されます。
XE4/iOS で新規導入。
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 での新規機能
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 未定義 未定義 未定義 定義済み 定義済み 定義済み 定義済み Delphi モバイル コンパイラなど、自動参照カウント機能を使用するコンパイラの場合に定義されます。
XE4/iOS で新規導入。
EXTERNALLINKER 未定義 未定義 未定義 定義済み 未定義 定義済み 定義済み 外部リンカと LLVM コード ジェネレータのあるコンパイラの場合に定義されます。Delphi モバイル コンパイラの場合は外部リンカ ld があり、LLVM をコード ジェネレータとして使用します。
XE4/iOS で新規導入。
UNICODE 定義済み 定義済み 定義済み 定義済み 定義済み 定義済み 定義済み UNICODE はデフォルトの文字列型として定義されます。
CONDITIONALEXPRESSIONS 定義済み 定義済み 定義済み 定義済み 定義済み 定義済み 定義済み $IF 指令が使用可能かどうかを検査します。
ELF 未定義 未定義 未定義 未定義 未定義 未定義 未定義 実行可能ファイルおよびリンク可能形式ファイル(ELF)を対象とする際、定義されます。
NEXTGEN 未定義 未定義 未定義 定義済み 定義済み 定義済み 定義済み インデックスが 0 から始まる文字列などの "次世代" 言語機能を使用している(Delphi モバイル コンパイラなどの)コンパイラの場合に定義されます。
XE4/iOS で新規導入。
PC_MAPPED_EXCEPTIONS 未定義 未定義 定義済み 未定義 定義済み 未定義 未定義 例外のアンワインドにスタック フレームワークではなくアドレス マップを使用するプラットフォーム(たとえば OS X など)を現在のプラットフォームまたはターゲット プラットフォームとしてコンパイルする場合に定義されます。
XE2 で新規導入。
PIC 対象外 対象外 -P が 指定されている場合、定義済み。 対象外 -P が 指定されている場合、定義済み。 常に定義済み 対象外 位置独立コード(PIC)が必要なプラットフォーム(たとえば OS X など)の場合に定義されます。
UNDERSCOREIMPORTNAME 定義済み 未定義 定義済み 未定義 定義済み 未定義 未定義 (たとえば、Mac OS からインポートされたダイナミック ライブラリの名前などの)先頭にアンダースコアを付けるコンパイラの場合に定義されます。
XE4/iOS で新規導入。
WEAKREF 未定義 未定義 未定義 定義済み 定義済み 定義済み 定義済み 弱い参照([Weak] 属性)を使用できるコンパイラの場合に定義されます。
XE4/iOS で新規導入。
WEAKINSTREF 未定義 未定義 未定義 定義済み 定義済み 定義済み 定義済み 弱い参照がインスタンスに定義される場合に定義されます。
XE4/iOS で新規導入。
WEAKINTFREF 未定義 未定義 未定義 定義済み 定義済み 定義済み 定義済み 弱い参照がインターフェイスに定義される場合に定義されます。
XE4/iOS で新規導入。

上記表の列見出しで、

  • DCC32 は Windows 版 32 ビット Delphi コンパイラです。
  • DCC64 は Windows 版 64 ビット Delphi コンパイラです。
  • DCCOSX は Mac OS X 版 Delphi コンパイラです。
  • DCCIOSARM は 32 ビット iOS デバイス用の Delphi コンパイラです。
  • DCCIOS32 は iOS シミュレータ用の Delphi コンパイラです。
  • DCCAARM.EXEAndroid デバイス用の Delphi コンパイラです。
  • DCCIOSARM64 は 64 ビット iOS デバイス用の Delphi コンパイラです。

コンパイラ バージョンを表す条件シンボルの使用

たとえば、コードのコンパイルに使用されるコンパイラやランタイム ライブラリのバージョンを判定するには、以下のように、{$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 は、ランタイム ライブラリのバージョンとして定義される定数です。Berlin の場合、RTLVersion は 31 です。
  • System.CompilerVersion は、現在の Delphi コンパイラのバージョンとして定義される定数です。Berlin の場合、CompilerVersion は 31 です。
  • FMX.Types.FireMonkeyVersion は、現在の FireMonkey ライブラリのバージョンとして定義される定数です。Berlin の場合、FireMonkeyVersion は 24 です。

関連項目

個人用ツール
他言語版
以前のバージョン
Assistance