Preprocessore

Il preprocessore è uno speciale sottosistema del compilatore MQL5 che è inteso per la preparazione del codice sorgente del programma, immediatamente prima che il programma venga compilato.

Il preprocessore permette miglioramenti della leggibilità del codice sorgente. Il codice può essere strutturato includendo file specifici che contengono codici sorgenti di programmi-mql5. La possibilità di assegnare nomi mnemonici a costanti specifiche contribuisce al miglioramento della leggibilità del codice.

Il preprocessore permette anche la determinazione dei parametri specifici di programmi-mql5:

Le direttive del preprocessore sono usate dal compilatore per pre-elaborare il codice sorgente prima di compilarlo. La direttiva inizia sempre con #, quindi il compilatore vieta l'utilizzo del simbolo nei nomi di variabili, funzioni, ecc.

Ogni direttiva è descritta da una voce separata ed è valida fino all'interruzione di riga. Non è possibile utilizzare più direttive in un'unica voce. Se la voce direttiva è troppo grande, può essere suddivisa in più righe usando il simbolo '\'. In questo caso, la riga successiva è considerata una continuazione della voce direttiva.

//+------------------------------------------------------------------+
//|  foreach pseudo-operator                                         |
//+------------------------------------------------------------------+
#define ForEach(index, array) for (int index = 0,                    \
   max_##index=ArraySize((array));                                   \
   index<max_##index; index++)    
//+------------------------------------------------------------------+
//| Funzione Start programma script                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   string array[]={"12","23","34","45"};
//--- bypassa l'array usando ForEach
   ForEach(i,array)
     {
      PrintFormat("%d: array[%d]=%s",i,i,array[i]);
     }
  }
//+------------------------------------------------------------------+
/* Risultato dell'output  
   0: array[0]=12
   1: array[1]=23
   2: array[2]=34
   3: array[3]=45
*/

Per il compilatore, tutti queste tre righe di direttive #definire sembrano un'unica lunga riga. L'esempio sopra vale anche al carattere ## che è un operatore di unione utilizzato nelle macro #define per unire i due token macro in uno solo. L'operatore di unione(merge) di token non può essere il primo o l'ultimo in una definizione di macro.