Sabitlerin Bildirimi (#define, #undef)

Ö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.

#define direktifi sabitlere anımsatıcı isimler verilmesi için kullanılır. İki biçimi vardır:

#define tanımlayıcı ifade                       // parametresiz biçim
#define tanımlayıcı(par1,... par8) ifade        // parametrik biçim

#define direktifi, ifadeyi kaynak metinde bulunan tüm tanımlayıcı girişleri için ikame eder. Tanımlayıcı, sadece ayrı bir simge olarak kullanılıyorsa ikame edilir. Bir yorumun, bir dizginin veya daha uzun başka bir tanımlayıcının parçasıysa ikame edilmez.

Sabit tanımlayıcı, değişken isimleri ile aynı kurallara göre yönetilir. Değer her tipten olabilir:

#define ABC               100
#define PI                3.14
#define COMPANY_NAME      "MetaQuotes Software Corp."
... 
void ShowCopyright()
  {
   Print("Copyright  2001-2009, ",COMPANY_NAME);
   Print("https://www.metaquotes.net");
  }

ifade; anahtar sözcükler, sabitler, sabit veya sabit olmayan ifadeler gibi çeşitli simgeden oluşabilir.  Satır sonu ile biter ve yeni satıra aktarılamaz.

Örnek:

#define TWO        2
#define THREE      3
#define INCOMPLETE TWO+THREE
#define COMPLETE  (TWO+THREE)
void OnStart()
  {
   Print("2 + 3*2 = ",INCOMPLETE*2);
   Print("(2 + 3)*2 = ",COMPLETE*2);
  }
// Sonuç
// 2 + 3*2 = 8
// (2 + 3)*2 = 10

 

Parametrik Biçim #define

Parametrik biçimde, kaynak metinde bulunan tüm tanımlayıcı girişleri, daha sonra gerçek parametreler hesaba katılarak, ifadeyle değiştirilir. Örneğin:

 // iki parametreli (a ve b) örnek
#define A 2+3
#define B 5-1
#define MUL(a, b) ((a)*(b))
 
double c=MUL(A,B);
Print("c=",c);
/*
ifade double c=MUL(A,B);
eşdeğerdir double c=((2+3)*(5-1));
*/
// Sonuç
// c=20

Parametreli ifadeler kullanırken parametreleri parantez içine yazdığınızdan emin olun. Bu yeterince açık olmayan, bulunması zor hataların önlenmesine yardımcı olacaktır. Kodu parantezler olmadan yeniden yazarsak sonuç farklı olur:

 // iki parametreli (a ve b) örnek
#define A 2+3
#define B 5-1
#define MUL(a, b) a*b
 
double c=MUL(A,B);
Print("c=",c);
/*
ifade double c=MUL(A,B);
eşdeğer double c=2+3*5-1;
*/
// Sonuç
// c=16

Parametrik biçim kullanılırken, en fazla 8 karaktere izin verilir.

 // doğru parametrik biçim
#define LOG(text)  Print(__FILE__,"(",__LINE__,") :",text)   // tek parametre - 'text'
 
 // yanlış parametrik biçim form        
#define WRONG_DEF(p1, p2, p3, p4, p5, p6, p7, p8, p9)   p1+p2+p3+p4 // p1'den p9'a kadar 8 parametreden fazla

#undef direktifi

#undef direktifi daha önce tanımlanan makro ikamesinin bildirimini iptal eder.

Örnek:

#define MACRO
 
void func1()
  {
#ifdef MACRO
   Print("MACRO is defined in ",__FUNCTION__);   
#else
   Print("MAKRO şu fonksiyonunda tanımlanmış: ",__FUNCTION__);
#endif
  }
 
#undef MACRO
 
void func2()
  {
#ifdef MACRO
   Print("MAKRO şu fonksiyonunda tanımlanmış: ",__FUNCTION__);
#else
   Print("MAKRO şu fonksiyonunda tanımlanmış: ",__FUNCTION__);
#endif
  }
 
void OnStart()
  {
   func1();
   func2();
  }
 
/* Sonuç:
MAKRO şu fonksiyonda tanımlanmış: func1
MAKRO şu fonksiyonda tanımlanmamış func2
*/

Ayrıca Bakınız

Tanımlayıcılar, Karakter Sabitleri