プリプロセッサ

プリプロセッサは、プログラムがコンパイルされる直前のプログラムソースコードの準備を目的とした MQL5 コンパイラの特別なサブシステムです。

プリプロセッサはソースコードの読みやすさを向上します。コードは、MQL5 プログラムのソースコードを含む特殊ファイルを含めることにより、構造化することが出来ます。定数への呼び名の割り当ては、コードの読みやすさの向上に貢献します。

またプリプロセッサは MQL5 プログラムの特定パラメータを決定することも出来ます。

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

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

//+------------------------------------------------------------------+
//|  foreach擬似演算子                                                 |
//+------------------------------------------------------------------+
#define ForEach(index, array) for (int index = 0,                    \
  max_##index=ArraySize((array));                                   \
  index<max_##index; index++)    
//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数                                              |
//+------------------------------------------------------------------+
void OnStart()
 {
  string array[]={"12","23","34","45"};
//--- ForEachを使用して配列をバイパスする
  ForEach(i,array)
    {
    PrintFormat("%d: array[%d]=%s",i,i,array[i]);
    }
 }
//+------------------------------------------------------------------+
/* 結果の出力  
  0: array[0]=12
  1: array[1]=23
  2: array[2]=34
  3: array[3]=45
*/

これら3つの #defineディレクティブは、コンパイラには1つの長い行のように見えます。上記の例は ##も適用します。これは、2つのマクロトークンを1つにマージする#defineマクロで使用されるマージ演算子です。トークンマージ演算子は、マクロ定義の最初または最後として使用することはできません。