Öntanımlı Makro İkameleri

Hata ayıklama sürecini basitleştirmek ve MQL5 programı hakkında bilgi edinmek amacıyla, değerleri derleme sırasında belirlenen özel makro sabitleri bulunmaktadır. Bu sabitleri kullanmanın en basit yolu, aşağıdaki örnekten de görülebileceği gibi, Print() fonksiyonu ile değerleri çıktılamaktır.

Sabit

Açıklama

__DATE__

Dosya derleme tarihi (zaman olmadan, yani saatler, dakikalar ve saniyeler 0'a eşit olacak şekilde)

__DATETIME__

Dosya derleme tarihi ve zamanı

__LINE__

Kaynak kodunda makronun yer aldığı satır sayısı

__FILE__

Derlenmiş mevcut dosyanın ismi

__PATH__

Derlenmekte olan dosyanın, salt adresi

__FUNCTION__

Makronun, gövdesine yerleştirildiği fonksiyonun ismi

__FUNCSIG__

Makro gövdesinin yerleştirildiği fonksiyonun işareti. aşırı-yüklenmiş fonksiyonların tanımlanmasında, fonksiyonun eksiksiz bir tarifi kullanışlı olabilir

__MQLBUILD__, __MQL5BUILD__

Derleyici sürüm numarası

__COUNTER__

Karşılaşılan her __COUNTER__ bildirimi için derleyici, sayaç değerini 0 ile N-1 arasında değiştirir; burada N, koddaki kullanım sayısıdır.  Kaynak kodu yeniden derlenirken __COUNTER__ sırası değişiklik yapılmadan garanti edilir.

__COUNTER__ değeri aşağıdaki şekilde hesaplanır:

  • ilk sayaç değeri 0'dır,
  • sayacın her kullanımından sonra değeri 1 artar,
  • ilk olarak, derleyici tüm makroları ve şablonları kaynak kodunda yerlerinde genişletir,
  • her bir şablon fonksiyonu için ayrı bir kod oluşturulur,
  • her bir şablon sınıfı/yapısı için de ayrı bir kod oluşturulur,
  • daha sonra, derleyici elde edilen kaynak kodun üzerinden tanımlanan sırayla geçer ve tespit edilen her __COUNTER__ kullanımını geçerli sayaç değeriyle değiştirir.

Aşağıdaki örnek, derleyicinin kaynak kodunu nasıl işlediğini ve karşılaştığı __COUNTER__ örneklerini sırayla artan değerlerle nasıl değiştirdiğini göstermektedir.

__RANDOM__

Derleyici, her __RANDOM__ bildirimi için rastgele bir ulong tipi değer ekler.

Örnek:

#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- Uzman Danışman başlatılması sırasında örnek bilgi çıktısı
   Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__);
//--- timer olayları arasındaki aralığı ayarla
   EventSetTimer(5);
//---
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Uzman danışman sonlandırılması sırasındaki bilgi çıktısı
   Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__);
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- tik alındığı zamanki bilgi çıktısı
   Print(" __MQLBUILD__ = ",__MQLBUILD__,"  __FILE__ = ",__FILE__);
   Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__);
   test1(__FUNCTION__);
   test2();
//---
  }
//+------------------------------------------------------------------+
//| test1                                                            |
//+------------------------------------------------------------------+
void test1(string par)
  {
//--- fonksiyon içi bilgi çıktısı
   Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__," par=",par);
  }
//+------------------------------------------------------------------+
//| test2                                                            |
//+------------------------------------------------------------------+
void test2()
  {
//--- fonksiyon içi bilgi çıktısı
   Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__);
  }
//+------------------------------------------------------------------+
//| OnTimer event handler                                            |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__);
   test1(__FUNCTION__);
  }

 

__COUNTER__ makrosu ile nasıl çalışılacağını öğrenmek için örnek

//--- ifadenin ve değerinin günlükte hızlı bir şekilde görüntülenmesi için bir makro oluştur
#define print(exprPrint(#expr,"=",expr)
 
//--- MACRO_COUNTER özel makrosunu önceden tanımlanmış __COUNTER__ makrosu aracılığıyla tanımla
#define MACRO_COUNTER __COUNTER__
 
//--- __COUNTER__ makrosunu kullanarak değişkenin girdi değerini ayarla
input int InpVariable = __COUNTER__;
 
//--- fonksiyonları tanımlamadan önce __COUNTER__ makrosunu kullanarak global değişkenin değerini ayarla
int ExtVariable = __COUNTER__;
 
//+------------------------------------------------------------------+
//| __COUNTER__ değerini geri döndüren fonksiyon                     |
//+------------------------------------------------------------------+
int GlobalFunc(void)
  {
   return(__COUNTER__);
  }
//+------------------------------------------------------------------+
//| __COUNTER__ değerini geri döndüren şablon fonksiyonu             |
//+------------------------------------------------------------------+
template<typename T>
int GlobalTemplateFunc(void)
  {
   return(__COUNTER__);
  }
//+------------------------------------------------------------------+
//| __COUNTER__ değerini geri döndüren metoda sahip yapı             |
//+------------------------------------------------------------------+
struct A
  {
   int               dummy;  // kullanılmamış
 
   int               Method(void)
     {
      return(__COUNTER__);
     }
  };
//+------------------------------------------------------------------+
//| __COUNTER__ değerini geri döndüren metoda sahip şablon yapısı    |
//+------------------------------------------------------------------+
template<typename T>
struct B
  {
   int               dummy;  // kullanılmamış
 
   int               Method(void)
     {
      return(__COUNTER__);
     }
  };
//+------------------------------------------------------------------+
//| __COUNTER__ değerini geri döndüren şablon metoduna sahip yapı    |
//+------------------------------------------------------------------+
struct C
  {
   int               dummy;  // kullanılmamış
 
   template<typename T>
   int               Method(void)
     {
      return(__COUNTER__);
     }
  };
//+------------------------------------------------------------------+
//| __COUNTER__ değerini geri döndüren fonksiyon #2                  |
//+------------------------------------------------------------------+
int GlobalFunc2(void)
  {
   return(__COUNTER__);
  }
//+------------------------------------------------------------------+
//| Script programı başlatma fonksiyonu                              |
//+------------------------------------------------------------------+
void OnStart(void)
  {
// makroda ve değişkenlerde __COUNTER__
   print(MACRO_COUNTER);
   print(InpVariable);
   print(ExtVariable);
 
//--- fonksiyonlarda __COUNTER__
   print(GlobalFunc());
   print(GlobalFunc());                // değer değişmedi
   print(GlobalTemplateFunc<int>());
   print(GlobalTemplateFunc<int>());   // değer değişmedi
   print(GlobalTemplateFunc<double>());// değer değişti
   print(GlobalFunc2());
   print(GlobalFunc2());               // değer değişmedi
 
// yapıda __COUNTER__
   A a1a2;
   print(a1.Method());
   print(a2.Method());                 // değer değişmedi
 
// şablon yapısında __COUNTER__
   B<intb1b2;
   B<doubleb3;
   print(b1.Method());
   print(b2.Method());                 // değer değişmedi
   print(b3.Method());                 // değer değişti
 
// şablon fonksiyonuna sahip yapıda __COUNTER__
   C c1c2;
   print(c1.Method<int>());
   print(c1.Method<double>());         // değer değişti
   print(c2.Method<int>());            // ilk c1.Method<int>() çağrısıyla aynı değer
 
//--- makro ve global değişkendeki __COUNTER__'a tekrar bir göz atalım
   print(MACRO_COUNTER);  // değer değişti
   print(ExtGlobal2);
  }
//--- fonksiyonları tanımladıktan sonra __COUNTER__ makrosunu kullanarak global değişkenin değerini ayarla
int ExtGlobal2 = __COUNTER__;
//+------------------------------------------------------------------+
 
/* Sonuç
   __COUNTER__=3
   InpVariable=0
   ExtVariable=1
   GlobalFunc()=5
   GlobalFunc()=5
   GlobalTemplateFunc<int>()=8
   GlobalTemplateFunc<int>()=8
   GlobalTemplateFunc<double>()=9
   GlobalFunc2()=7
   GlobalFunc2()=7
   a1.Method()=6
   a2.Method()=6
   b1.Method()=10
   b2.Method()=10
   b3.Method()=11
   c1.Method<int>()=12
   c1.Method<double>()=13
   c2.Method<int>()=12
   __COUNTER__=4
   ExtGlobal2=2
 
*/