Bedingte Kompilierung (#ifdef, #ifndef, #else, #endif)

Der Compiler verwendet Direktiven des Präprozessors für eine vorbereitende Verarbeitung eines Quellcodes vor der Kompilierung. Die Direktive beginnt immer mit dem Zeichen # (Doppelkreuz), deswegen verbietet der Compiler, dieses Zeichen in den Namen von Variablen, Funktionen usw. zu verwenden.

Jede Direktive wird in einem separaten Eintrag beschrieben und ist bis zum Zeilenumbruch gültig. In einem Eintrag können Sie nur eine Direktive verwenden. Wenn der Eintrag der Direktive zu groß ist, kann er mithilfe des Zeichens '\' in mehrere Zeilen aufgeteilt werden. In diesem Fall gilt die nächste Zeile als eine Fortsetzung des Eintrags dieser Direktive.

Durch Direktiven für die bedingte Kompilierung von Präprozessor cessor können Sie Teil des Programms kompilieren oder vermissen, abhängig von der Erfüllung bestimmter Bedingungen.

Der Bedingung kann eine der nachfolgend beschriebenen Formen annehmen.

#ifdef identifier
   // Code hier wird kompiliert, wenn identifier bereits für die Präprozessor in Befehl #define definiert wurde.
#endif

#ifndef identifier
   // Code hier wird kompiliert, wenn identifier für die Präprozessor in Befehl #define derzeit nicht definiert ist.
#endif

Jedem der Befehlen der bedingten Kompilierung kann eine beliebige Anzahl von Zeilen folgen, die möglicherweise der Befehl #else mit Ende #endif enthalten. Wenn die Bedingung erfüllt ist, werden die Zeilen zwischen #else und #endif ignoriert. Ist die Bedingung nicht erfüllt, dann alle Zeilen zwischen dem Prüfung und Befehl #else ignoriert werden. Wenn es dieser Befehl gibt nicht, dann zwischen dem Prüfung und dem Befehl #endif.

Beispiel:

#ifndef TestMode
   #define TestMode
#endif
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   #ifdef TestMode
      Print("Test mode");
   #else
      Print("Normal mode");
   #endif
  }

Abhängig vom Typ des Programms und Standardkompilierungmodus, werden Makros wie folgt definiert:

Makro __ MQL5__ ist bei der Kompilierung der Datei *.mq5 verfügbar. Bei der Kompilierung von *.mq4 ist Makro __ MQL4__ verfügbar.
Makro _DEBUG ist bei der Kompilierung für die Fehlersuche verfügbar.
Makro _Release ist bei der Kompilierung für anders als Fehlersuche verfügbar.

Beispiel:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
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
  }