Koşullu Derleme (#ifdef, #ifndef, #else, #endif)

Önişlemci yönergeleri derleyici tarafından derlenmeden önce kaynak kodunu ön işleme koymak için kullanılır. Yönerge her zaman # ile başlar, bu nedenle derleyici değişkenlerin, fonksiyonların vb. simlerinde sembol kullanımını yasaklar.

Her direktif ayrı bir girdi ile tanımlanır ve satır sonuna kadar geçerlidir. Bir girişte birkaç yönergeyi kullanamazsınız. Yönerge girişi çok büyükse, '\' simgesini kullanarak birkaç satıra bölünebilir. Bu durumda, bir sonraki satır direktif girişinin bir devamı olarak kabul edilir.

Önişlemci koşullu derleme direktifleri, belirli bir koşulun gerçekleşmesine bağlı olarak, programın bir bölümünü derlemenizi veya atlamnızı sağlar.

Bahsedilen bu koşul aşağıdaki şekillerden birini alabilir.

#ifdef identifier
   // tanımlayıcı, #define direktifindeki ön işlemci için tanımlanmışsa, burada yer alan kod derlenir.
#endif

#ifndef tanımlayıcı
   // tanımlayıcı henüz #define önişlemci direktifi tarafından tanımlanmamışsa burada yer alan kod derlenir.
#endif

Koşullu derleme direktiflerinin tümü, muhtemelen #else direktifini taşıyan ve #endif ile sonlanan herhangi sayıda satır ile devam edebilir. Onaylanan koşulun doğru olması durumunda #else ve #endif arasında kalan satırlar gözardı edilir. Onaylanan koşul gerçekleşmemişse, kontrol ile #else direktifi (veya biçimlendiricinin olmaması durumunda #endif direktifi) arasında kalan tüm satırlar gözardı edilir.

Örnek:

#ifndef TestMode
   #define TestMode
#endif
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   #ifdef TestMode
      Print("Sınama modu");
   #else
      Print("Normal mod");
   #endif
  }

Standart makrolar, program tipine ve derleme moduna bağlı olarak şu şekilde tanımlanırlar:

__MQL5__ makrosu bir *.mq5 dosyası derlenirken, __MQL4__ makrosu ise bir *.mq4 dosyası derlenirken tanımlanır.
_DEBUG makrosu, hata ayıklama modunda,
_RELEASE makrosu ise sürüm modunda derleme yapılırken tanımlanır.

Örnek:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
#ifdef __MQL5__
   #ifdef _DEBUG
      Print("MQL5 derleyicisinden merhaba [DEBUG]");
   #else
      #ifdef _RELEASE
         Print("MQL5 derleyicisinden merhaba [RELEASE]");
      #endif
   #endif
#else
   #ifdef __MQL4__
      #ifdef _DEBUG
         Print("MQL4 derleyicisinden merhaba [DEBUG]");
      #else
         #ifdef _RELEASE
            Print("MQL4 derleyicisinden merhaba [RELEASE]");
         #endif
      #endif
   #endif
#endif
  }