C Sharp Programlama Dili/Önişlemci komutları

Ders 26. Önişlemci komutları


Şimdiye kadar gördüğümüz kodlar direkt olarak exe dosyasına katılıyordu. Şimdi göreceğimiz önişlemci komutlarının görevi ise sadece derleyiciye derlemenin nasıl yapılacağı hakkında bilgi vermektir. Önişlemci komutları derleme sonucu oluşan exe dosyasına aktarılmazlar. Önişlemci komutları # karakteri ile belirtilirler. C# kodlarından farklı olarak önişlemci komutları enter'la sonlandırılmalıdır. Sonlarında ; karakteri bulunmaz. Şimdi isterseniz bütün önişlemci komutlarını teker teker görelim.

#defineDüzenle

#define komutu bir sembol tanımlamak için kullanılır. Sembollerin tek başlarına bir anlamı yoktur. İleride göreceğimiz diğer önişlemci komutlarının çalışabilmeleri için gereklidirler. #define ile sembol tanımlama program kodlarının en başında, (using deyimlerinden de önce) olmalıdır. Örnek program:

 #define ENGLISH
 #define TURKISH
 using System;
 class Onislemci
 {
    static void Main()
    {
    }
 }

Bu programda ENGLISH ve TURKISH isimli iki sembol tanımlanmıştır. Diğer bütün önişlemci komutlarında olduğu gibi önişlemci komut parçaları arasında (örneğin #define ile TURKISH arasında) en az bir boşluk olmalıdır. Aynı sembolün tekrar tekrar tanımlanması hata verdirmez.

#undefDüzenle

#define ile tanımlanmış bir sembolü kaldırmak için kullanılır. Olmayan bir sembolü kaldırmaya çalışmak hata verdirmez. Programın herhangi bir satırında olabilir. Örnek program:

 #define ENGLISH
 using System;
 #undef ENGLISH
 class Onislemci
 {
    static void Main()
    {
    }
 }

Sembollerin büyük ya da küçük harf olması zorunlu değildir. Ancak tamamen büyük harf okunurluğu artırdığı için tavsiye edilir. Sembollerin büyük-küçük harf duyarlılığı vardır.

#if ve #endifDüzenle

#if ve #endif komutları bir sembolün tanımlanmış olup olmamasına göre birtakım kodların derlenip derlenmemesinin sağlanması için kullanılır. Yani son tahlilde kaynak kodun bir kısmı exe dosyasına ya eklenir ya eklenmez. Önişlemci komutlarında bloklar olmadığı için #endif komutu da #if komutunun açtığı kod bölgesini kapatmak için kullanılır. Yani #if ve #endif arasındaki kodlar koşula göre derlenip derlenmez. Örnek program:

 #define ENGLISH
 using System;
 class Onislemci
 {
    static void Main()
    {
       Console.WriteLine("Programa hoş geldiniz.");
       #if ENGLISH
       Console.WriteLine("Bu program ENGLISH");
       #endif
    }
 }

Bu program ekrana şu çıktıyı verecektir.

Programa hoş geldiniz.
Bu program ENGLISH

Eğer programın başına #define ENGLISH satırını eklemeseydik program çıktısındaki ikinci satır olmayacaktı. #if önişlemci komutuyla mantıksal operatörleri de kullanabiliriz. Örnek program:

 #define ENGLISH
 #define TURKISH
 using System;
 class Onislemci
 {
    static void Main()
    {
       Console.WriteLine("Programa hoş geldiniz.");
       #if ENGLISH && (!TURKISH)
       Console.WriteLine("Bu program ENGLISH");
       #endif
    }
 }

Bu program sonucunda ekrana yalnızca Programa hoş geldiniz. satırı yazılacaktır. Şimdi bu mantıksal operatör durumlarını topluca görelim:
#if ENGLISH && TURKISH ENGLISH ve TURKISH varsa
#if ENGLISH || TURKISH ENGLISH veya TURKISH varsa
#if ENGLISH && (!TURKISH) ENGLISH var ama TURKISH yoksa
#if ENGLISH && (TURKISH==false) ENGLISH var ama TURKISH yoksa
Benzer şekilde çoklu koşullandırmalar da mümkündür. Örnek:
#if ENGLISH && TURKISH && FRANSIZCA

#elseDüzenle

#else önişlemci komutu C#'taki else ile aynı göreve sahiptir. Koşul sağlanmışsa bir kod bloğunun derlenmesini sağlayan #if komutu ile birlikte kullanılır. Örnek:

 #define ENGLISH
 using System;
 class Onislemci
 {
    static void Main()
    {
       Console.WriteLine("Programa hoş geldiniz.");
       #if ENGLISH
       Console.WriteLine("Bu program ENGLISH");
       #else
       Console.WriteLine("Bu program ENGLISH değil");
       #endif
    }
 }

Gördüğünüz gibi #else komutu #if ile #endif arasında kullanılıyor. Başka bir örnek:

 #define ENGLISH
 using System;
 #if ENGLISH 
 class Onislemci
 {
    static void Main()
    {
       Console.WriteLine("Bu program ENGLISH");
    }
 }
 #else
 class Onislemci
 {
    static void Main()
    {
       Console.WriteLine("Bu program ENGLISH değil");
    }
 }    
 #endif

Bu programda aynı isimli birden fazla sınıf aynı kaynak kodda olmasına rağmen program hata vermedi. Çünkü her halukarda bu sınıflardan yalnızca biri derlenecektir.

#elifDüzenle

#elif C#'taki else if'in kısaltılmışıdır. Yani değilse bir de bu koşula bak anlamı verir. Örnek program:

 #define ENGLISH
 using System;
 class Onislemci
 {
    static void Main()
    {
       Console.WriteLine("Programa hoş geldiniz.");
       #if ENGLISH
       Console.WriteLine("Bu program ENGLISH");
       #elif TURKISH
       Console.WriteLine("Bu program TURKISH");
       #else
       Console.WriteLine("Bu program hem TURKISH, hem de ENGLISH değil");
       #endif
    }
 }

#elif komutlarının sayısını bir #if-#endif aralığında istediğimiz kadar artırabiliriz.
NOT: İç içe geçmiş #if-#elif-#else komutları da olabilir. Örnek program:

 #define ENGLISH
 using System;
 class Onislemci
 {
    static void Main()
    {
       #if ENGLISH
        #if TURKISH
       Console.WriteLine("Bu program hem ENGLISH hem TURKISH");
        #endif
       #elif TURKISH
       Console.WriteLine("Bu program sadece TURKISH");
       #endif
    }
 }

#errorDüzenle

#error komutu derleyiciyi hata vermeye zorlamak için kullanılır. Örnek program:

 #define ENGLISH
 #define TURKISH
 using System;
 class Onislemci
 {
    static void Main()
    {
       #if ENGLISH && TURKISH
          #error Hem TURKISH hem ENGLISH aynı anda olamaz.
       #endif
    }
 }

Bu program kodumuz derlenmeyecek, hata mesajı olarak da ekrana Hem TURKISH hem ENGLISH aynı anda olamaz. yazacaktır.

#warningDüzenle

#warning komutu #error komutu ile aynı mantıkta çalışır. Tek fark ekrana hata değil, uyarı verilmesidir. Yani programımız derlenir, ama uyarı verilir. Örnek program:

 #define ENGLISH
 #define TURKISH
 using System;
 class Onislemci
 {
    static void Main()
    {
       #if ENGLISH && TURKISH
          #warning Hem TURKISH hem ENGLISH tavsiye edilmez.
       #endif
    }
 }

#lineDüzenle

Eğer programımızda bir hata var ve derleyici de (csc.exe) bu hatayı tespit etmişse bize bu hatanın hangi dosyanın hangi satırında olduğunu verir. İstersek #line komutuyla bu dosya adını ve satır numarasını değiştirebiliriz. Yani tabiri caizse derleyiciyi kandırabiliriz. #line komutu kendinden hemen sonra gelen satırın özelliklerini değiştirmek için kullanılır. Örnek program:

 using System;
 class Onislemci
 {
    static void Main()
    {
       #line 1 "YeniDosya.cs"
       int a="deneme";
    }
 }

Bu programda int türünden olan a değişkenine yanlış türde sabit atadık. Bu hatayı bilinçli olarak yaptık. Derleyici hatanın 1. satırda ve YeniDosya.cs dosyasında olduğunu iddia edecektir. Çünkü artık derleyici #line 1 "YeniDosya.cs" komutundan hemen sonra gelen satırı 1. satır ve YeniDosya.cs dosyası olarak tanıyor.

#region ve #endregionDüzenle

#region ve #endregion komutlarının, kodları Not Defteri'nde yazan bizler için pek bir önemi yok. Çünkü #region ve #endregion komutları kodları bölgelere ayırmaya yarıyor. Kod bölgesinin yanındaki + işaretine tıklayınca kodlar gösteriliyor, gösterilen kodların yanındaki - işaretine tıklayınca da kodlarımız gizleniyor. Bu komut Visual Studio veya Not Defteri'nden daha gelişmiş bir editör programı kullananlar için faydalı olabilir. Örnek:

 using System;
 class Onislemci
 {
    static void Main()
    {
       #region YeniAlan
       //Bu kısmı yeni bir bölge yaptık
       #endregion
    }
 }

Neden önişlemci komutları?Düzenle

Önişlemci komutları genellikle belirli koşullara göre programımızın yalnızca bir kısmını derlemek için kullanılır. Örneğin bir programın hem İngilizce hem Türkçe versiyonunu aynı kaynak kodda bulunduruyorsak önişlemci komutlarını programın yalnızca Türkçe ya da yalnızca İngilizce versiyonunu derlemek amacıyla kullanabiliriz.

Bu kitabın diğer sayfaları
  • Sınıflar
  • Operatör aşırı yükleme
  • İndeksleyiciler
  • Yapılar
  • Enum sabitleri
  • İsim alanları
  • System isim alanı
  • Temel I/O işlemleri
  • Temel string işlemleri
  • Kalıtım
  • Arayüzler
  • Partial (kısmi) tipler
  • İstisnai durum yakalama mekanizması
  • Temsilciler
  • Olaylar
  • Önişlemci komutları
  • Göstericiler
  • Assembly kavramı
  • Yansıma
  • Nitelikler
  • Örnekler
  • Şablon tipler
  • Koleksiyonlar
  • yield
  • Veri tabanı işlemleri
  • XML işlemleri
  • Form tabanlı uygulamalar
  • Visual Studio.NET
  • Çok kanallı uygulamalar
  • ASP.NET