条件付きコンパイル( #ifdef、#ifndef、#else、#endif )

プリプロセッサディレクティブはコンパイルする前にソースコードを前処理するためにコンパイラによって使用されます。ディレクティブは常に#で始まります。したがって、コンパイラは変数名、関数名などでのこのシンボルの使用を禁止します。

各ディレクティブはエントリごとに指定されます。1つのエントリで複数のディレクティブを使用することはできません。ディレクティブエントリが大きすぎる場合は、 '\' 記号を使用して複数の行に分割します。この場合、次の行はディレクティブエントリの続きと見なされます。

プリプロセッサの条件付きコンパイルディレクティブは、特定の条件の成立に応じて、プログラムの一部をコンパイルまたはスキップすることを可能にします。

条件は、次のいずれかの形式を取ることが出来ます。

#ifdef 識別子
  //ここにあるコードは、識別子がすでに #define ディレクティブのプリプロセッサに定義されている場合にコンパイルされます。
#endif

#ifndef 識別子
  // ここにあるコードは、識別子がすでに #define ディレクティブのプリプロセッサに定義されていない場合にコンパイルされます。
#endif

条件付きコンパイルディレクティブは複数の行で続けられ、任意の #else を含んで #endif で終わります。検証条件が true の場合、#else と #endif の間の行は無視されます。検証条件が満たされていない場合は、チェックと #else ディレクティブ( #else が存在しない場合は #endif ディレクティブ)の間の行は全て無視されます。

例:

#ifndef TestMode
  #define TestMode
#endif
//+------------------------------------------------------------------+
//| スクリプトプログラムを開始する関数                                          |
//+------------------------------------------------------------------+
void OnStart()
 {
  #ifdef TestMode
    Print("Test mode");
  #else
    Print("Normal mode");
  #endif
 }

標準マクロは、プログラムの種類とコンパイルモードに応じて以下のように定義されています。

__MQL5__  マクロは *.mq5 ファイル、__MQL4__ は *.mq4 ファイルをコンパイルする時に定義されます。
_DEBUG マクロはデバグモードでコンパイルする時に定義されます。
_RELEASE マクロはリリースモードでコンパイルする時に定義されます。

例:

//+------------------------------------------------------------------+
//| スクリプトプログラムを開始する関数                                          |
//+------------------------------------------------------------------+
void OnStart()
 {
  #ifdef __MQL5__
    #ifdef _DEBUG
        Print("Hello from MQL5 compiler [DEBUG]");
    #else
      #ifdef _RELEASE
          Print("Hello from MQL5 compiler [RELEASE]");
      #endif
    #endif
  #else
    #ifdef __MQL4__
        #ifdef _DEBUG
          Print("Hello from MQL4 compiler [DEBUG]");
      #else
          #ifdef _RELEASE
            Print("Hello from MQL4 compiler [RELEASE]");
          #endif
      #endif
    #endif
  #endif
 }