7 Kasım 2009 Cumartesi

Her Gün Bir Yanlış(1. Yanlış): #undef Deyimi

Daha önce yazmıştım; her kitapta teknik veya dil yanlışları olabilir. Önemli olan bu yanlışların sayısı ve önemidir. Yanlışsız kitap yazmak neredeyse imkânsız olduğu için hedefim hep az yanlışa sahip kitaplar yazmak oldu. Ne zaman okurun birisi kitabımdaki bir yanlışı ilettiğinde kendisine teşekkür edip söz konusu yanlışı ilk fırsatta düzeltme yoluna gittim. Zaten Dünyadaki yazarların neredeyse tamamı böyle davranır. Bu nedenledir ki kitap basıma verildikten kısa bir süre sonra fark edilen hatalar "Düzeltme Listesi" adı altında bir şekilde okura iletilmek istenir.

C# konulu programcılık kitabının yanlışlarından söz edildiği bu yazı dizisini hazırlarken kendimi yazar Memik Yanık olarak değil okur yerine koydum. Yani adını burada anmadığım yazara diyorum ki “ey yazar arkadaş kitabında şu şu yanlışlar var, bir zahmet yeni baskıda bu yanlışları düzelt, okura saygının gereği olarak kişisel sitende bu yanlışlardan okurlarına söz edin lütfen”. Bakalım yazar arkadaş iyi niyetli bu çalışmaya ne tepki verecek?

Bu yazı dizisinde yaklaşık 550 sayfalık bir C# kitabının yanlışlarını ortaya koyacağım. Bunu yaparken her gün kitabın bir sayfasını rastgele açıp o sayfadaki hatayı ve doğrusunu yazacağım. Bu hataların sayısı kaç olur şimdiden bilemem. Ancak bu sayının en az 25 olacağını şimdiden söyleyebilirim. Çünkü test amaçlı olarak yaptığım denemelerde her 5-6 sayfada bir yanlışa rastadım. Tabi söz konusu kitabın yanlışlarını ortaya koyarken yanlış yapmam da ihtimal dahilindedir. Bu nedenle olası yanlışlarım için kitabın yazarından simdiden özür dilerim ve yanlışlardan söz ederken yapacağım yanlışlarımı düzeltmek için bir uyarının, bir mail'in yeterli olduğunu bilmenizi isterim. Burada sözünü ettiğim hatanın incelediğim kitabın hangi sayfasında olduğunu yazmayacağım. İşte söz konusu kitaptan alınıp anlamı korunup biraz değiştirilmiş bir cümle.

"demirspor isimli değişken "#undef" komutu sayesinde deklare edilmiştir."

Bu cümlede yazarımız undef adlı önişlemci deyimiyle değişken deklare edildiğini yazmış. Gerçekte C# programlama dilinde #define önişlemci deyimi ile kodun başında veya derleme satırında parametreler kullanılarak sembol veya sabit tanımı yapılmaktadır. #undef deyimi ise bu sabitleri tanımsız duruma getirebilmektedir. Yani yazarımız yanılıyor:Çünkü undef deyimi ile deklarasyon yapılmıyor. Belki bazılarınız yazarın bu cümlesine yanlışlıkla define yerine undef'i almış olduğunu düşünecektir. Eğer yazarımız kitabında verdiği kodda define deyimi ile tanımlama yapmış olsaydı derdik ki bu cümledeki hata dalgınlık sonucu yapılmıştır. Ne var ki yazarımız kitabında verdiği kodda undef deyimine yer verip tanımlama yaptığını belirtmiştir.

Diğer yandan #undef deyimi ile olmayan veya #define deyimi ile tanımlanmayan bir sabiti tanımsız duruma düşürmek istediğinizde C# derleyicisi "dur arkadaş bu sabit tanımlı değil ki tanımsız yapayım, sen olmayan bir şeyi bana yok et diyorsun" demiyor. Yazar arkadaşımız C# derleyicisinin azizliğine uğramış yukarıda verilen cümleyi kitabına almıştır. Başka bir deyişle yazarımız C# derleyicisinin önişlemci deyimleri hakkında yeterince bilgi edinmeden, yeterince araştırma yapmadan kitabında ön işlemci deyimlerinden söz etmiştir. Önişlemciler hakkında bilgi sahibi olmak isteyenler için C# 3.0 kitabımın bir sayfasını aşağıda istifadenize sundum.

#define Önişlemci Deyimi

Bu deyimle programın tümü üzerinde etkili olacak sabit tanımlamaları veya adlandırmalar yapmak mümkündür. define önişlemci deyimi ile sabit tanımlanıp veya adlandırma yapıldığı gibi PSEUDO denilen yalancı fonksiyonlar tanımlanabilir. Tabii ki bu şekilde tanımlanan PSEUDO fonksiyonlar basit olacaklardır. define önişlemci deyimi ile gelişmiş fonksiyonlar hazırlamak pratik değildir.

#define deyiminin başına diğer önişlemci deyimlerinde olduğu gibi # işareti getirilmelidir. define deyimi ile yapılan tanımlamalar programın tümü üzerinde etkili olduğu için kodun en üstüne yazılırlar.

Aşağıda verilen kısa kodda define deyimi ile değer aktarılmayan bir sabit tanımladık. Bu andan itibaren bu uygulamanın DENEME adında bir sabiti bulunmaktadır. Hemen eklemek gerekirse bu sabit başka kod dosyalarında yaşamaz.

#define DENEME
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
}


Derleme işlemi bu sabitin bulunması veya bulunmamasına göre yapılır. Ancak bu sabitin veya önişlemci bildirimin varlığı veya yokluğu bir başka önişlemci deyimi olan #if ile kontrol edilir. #if deyimi ile kontrol işleminin nasıl yapıldığını aşağıda görebilirsiniz.

private void Form1_Click(object sender, EventArgs e)
{
#if DENEME
MessageBox.Show("DENEME adında bir sabit tanımlanmış");
#endif
}


#define deyimi ile tanımlanan sabitlerin kontrolü #if-#endif bloğu içinde yapılmakta­dır. Bu kodu yorumlamak gerekirse şunlar söylenebilir: Daha önceden #define deyimi ile DENEME adında bir sabit tanımlandığı için “#if DENEME” satırı doğru değerini verir ve MessageBox sınıfının Show() metodunun kullanıldığı satır EXE koda dahil edilir. DENEME adlı sabit daha önceden tanımlanmadıysa veya tanımlanıp yok edildiyse #if ile #endif satırları arasında kalan satırlar EXE koda dahil edilmez.

0 yorum: