Препроцессор

Препроцессор – это специальная подсистема компилятора MQL5, которая занимается предварительной подготовкой исходного текста программы непосредственно перед ее компиляцией.

Препроцессор позволяет улучшить читаемость исходного кода. Структурирование кода может быть достигнуто путем включения отдельных файлов с исходными кодами mql5-программ. Улучшению читаемости кода способствует и возможность присвоения мнемонических имен отдельным константам.

Препроцессор позволяет также определять специфические параметры mql5-программ:

Директивы препроцессора используются компилятором для предварительной обработки исходного кода перед его компиляцией. Директива всегда начинается со знака # (решетка), поэтому компилятор запрещает использовать данный символ в именах переменных, функций и т.д.

Каждая директива описывается отдельной записью и действует до переноса строки. Нельзя в одной записи использовать несколько директив. Если запись директивы получается слишком большой, то её можно разбить на несколько строк с помощью обратного слеша '\', в таком случае следующая строка будет считаться продолжением записи директивы.

//+------------------------------------------------------------------+
//|  псевдоопореатор foreach                                         |
//+------------------------------------------------------------------+
#define ForEach(index, array) for (int index = 0,                    \
   max_##index=ArraySize((array));                                   \
   index<max_##index; index++)    
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
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
*/

Для компилятора все эти три строчки директивы #define будут выглядеть как одна длинная строка. В этом примере также используется двойной знак решетки ##, который называется оператором слияния и используется в макросах #define для объединения двух токенов макроса в один. Оператор слияния токенов не может быть первым или последним в определении макроса.