Gömülü C – 10 : Gömülü C: Etiketler ve Makrolar

Bu günkü yazımda, diğer yazılarda da ucundan kulağında bir miktar bahsetmiş olduğum #define ile tanımlanan etiketler üzerinde duracağım. Her durumda etiketleme yapmak doğru olmayabilir, ancak C dilinde etiketler çok  önemlidir. Bu sebeple, çiçek gibi kodlama yapmak için bu müstesna özelliği ne şekilde kullanmak lazım ona değineceğim.

Bunları ifade ederken, dayıyla olan anılarımızdan dem vuracağım. Yani bu yazının teması bizim dayı.

Etiketler diye adlandırdığım bu #define nanesi genel olarak iki temel amaca hizmet eder efem: etiketleme amacı ve fonksiyonel amaç. Her iki amacın da altına yatan nane aynı define nanesi olduğun için, nanenin iki çeşit sıkılmış suyu da özünde aynı tadı verir. Bu tadın güzel olması için bir iki püf noktasını aklımızda tutmamızda sayısız faideler var. İşbu yazıda bu püf noktalara dem vurulacaktır.

Etiketleme Amacıyla Kullanımı

Bu kullanımı esasen magic number coding kısmında anlatmıştım ama şimdi biraz daha farklı bir açıyla konuyu felsefi olarak irdeleyeceğim. #define ifadesinin etiketleme amacıyla kullanılması esasen, verinin bilgiye dönüştürülmesi yani bir anlamda verinin bilgi olarak etiketlenmesidir.

Hatırlayın, ‘A’ karakteri de, emeklilik yaşı da 65 sayısı ile ifade ediliyordu. Yani burada iki farklı bilgi, aynı veriyle ifade edilebiliyordu. O zaman hangi verinin hangi bilgiyi etiketlediğini bilebilmek için basitçe onu etiketlememiz gerekiyor 🙂

Kötü örnekten örnek olmaz ama, misal diye söze başlayarak bir kötü örnekle devam edelim.

Kötü Örnek:

Şimdi bu kodu yazan dayı bir nane yemiş yazmış, belli ki de çalışıyor diye sonradan da bozmamış. Hadi dayı bu naneyi yemiş, kimse de çıkıp dememiş ki “Aga bu nedir?”. Ben gittim sordum, kodu yazan dayının amacı, bir işçi eğer 65 yaşından büyükse, o ilgili şirkette A sınıfı bir çalışan oluyormuş. Yazılım da şirket çalışanlarını bu anlamda kontrol edip etiketliyormuş. Dayı dedim bak bizim blogda böyle böyle mevzular var, bunun adı magic number coding. Hadi biz gördük sineye attık, el-alem görse bu koda ne der? Düzeltelim öyleyse dedi dayı, neye düzelttiğini siz biliyorsunuz :).

İyi Örnek:

Neyse çıktım sonra dayının yanından, yürüyorum. Bi baktım arkadan biri “hooooop” diye bağırıyor. Döndüm bir baktım yine bizim dayı. Dayı bir disketi elime tutuşturdu. Al dedi yeğen, lazım olur. Neyse güç bela disket okuyuculu bir bilgisayar buldum ve içindeki .c uzantılı dosyayı gördüm. Heyecanla dosyayı açtığımda, olan biteni hemen anladım. Çünkü dayı kodu düzeltmiş, alemlere ibret olsun diye diske koymuş. Yazılımı okurken sanki şiir okur gibi, her bir şeyi anladım. Eşşeği bağlasak o da anlardı, kod öyle sanatsal yazılmıştı. Hele de  AGE_TO_BE_RETIRED ile WORKER_CLASS_A’nın aynı değere sahip olup başka mevzuları anlattığını görünce, gözümün önünden nef-i üstadın şiirleri geçti. Kafiye misali iki şey aynı veriyle ifade edilmiş ama bambaşka bilgileri taşıyordu. Derin bi nefes aldım ve içinden dedim ki dayı helal olsun.

Fonksiyonel Amaçlı Kullanım

Malumunuz fonksiyon, çok güzel ama pahalı bir olay. Bir fonksiyon tanımlayınca yok stack idi yok parametrelerin kopyalanması idi yok v tablosuydu çok masraf oluyor. Dertlendim bir gün, gittim dayıya. Dayı dedim enflasyon olmuş bilmem kaç? Bu fonksiyon çok pahalı dedim. Hep kambur sandığım omurgasını doğrulttu ve uzaklara bakarak dedi ki: “doğrudur yeğen, ama her derdin bir ilacı var”. Nedir dedim dayı, derdime derman. Gel beri bre çoban dedi, gel.

Önce dedi, yol yordam. #define var dedi bizim, ama fonksiyon yerine kullanacaksan, hor kullanmayacaksın, ne yaptığını bileceksin dedi. Nasıl yani dedim? Önce dedi kötüsünü göstereyim.

Kötü Örnek:

Dedim dayı bu kod bizim blogda vardı. Yeğen dedi, hakikat hep gözümüzün önünde değil midir? Tamam dedim dayı dinliyorum. Bak bu kod dedi, şuna çevrilir.

Bu da dedi, kemdir, hiç bir derleyici bunu kabul etmez. El-aleme rezil rüsva olmak var. Ama bunun da bir çözümü var, dedi. Dedim dayıcım bak yazmıştık bunu, dur dedi. Tamam dedim.

İyi Örnek:

Bak dedi, bunu böyle yazarsan her türlü çalışır. Su gibi, çiçek gibi olur. Mis kokularla akar gider dedi. Dedim dayıcım… Biliyorum dedi, ama bir kez daha hatırlatmakta sayısız feyizler var dedi.

Dedim dayıcım yeni numaralar var mı? Var dedi, beni takip et. Neyse bir alışveriş merkezine girdik. Dedi burada sana get-set kullanımı ile ilgili önemli bir ilim aktaracağım. Bak dedi #define’ın get amaçlı kullanımı çok tehlikelidir. Sen hataları baştan önlemezsen, hatalar gelir seni bulur. Misal dedi:

Sıkıntılı Örnek:

Bak yeğen dedi dayı. Yıkarıdaki GET makrosunu sen yazmıştın ama dış güçler, senin yazdığın makroyu aşağıdaki gibi haince kullanarak, makinemizin sıcaklığı ile oynadılar. Makinelerin garantisinin bittiği gün hepsini yaktılar. Oldu mu dedi şimdi?

Dedim dayı ne diyorsun? Şaka şaka dedi, ama dedi bak önlemini şöyle al.

Sıkıntısız Örnek:

 

Koda baktım, dedim ne çakallık, pes doğrusu. Dayı, değişkeni get ederken başına koduğu const ile, değişkeni read only yani sadece okunur yapmıştı. Dayı dedim bu da bana ders olsun, senden korkulur. Ne sandın yeğen dedi.

Karakter Savaşları

Neyse çıkışta dayı tutturdu tarih anlatıcam diye. Ne tarihi? Savaş tarihi. Kimin savaşı? Karakterlerin. Haydi hayırlısı dedim. Dayı dedi ki, derleyici de sonuçta insan işi. İradesi küll-i. Çok karıştırırsan kafasını hata yapar dedi. Ben kahkahayı patlatınca, açtı kodu pat diye.

Kötü Örnek:

Bak dedi yeğen, bu makroda hangi c, makrodan alınacak belli olmadığından, her derleyici buna aynı cevabı vermez. Kafası karışır biri c karakteriyle girdiğin sayıyı toplar biri başka iş yapar dedi. Gözlerimi faltaşı gibi açıp, ibreti download etmeye başladım. Download işi biter bitmez dayı bir de bu kodu incele dedi.

İyi örnek:

Bak dedi yeğen, bu tanımda karakter savaşları olmaz. Herkesin yeri belli, burada sulh tahsis edilmiş olur dedi. Bu ibreti de download ederek olay yerinden usulca uzaklaştım.

Dayıyla o günlük muhabbetimiz burada tamamlandı. Hepinize selamı var 🙂

Unutmadan; yazıları beğendiyseniz eğer,  faydalanabilecek arkadaşlarınızla da paylaşabilirseniz sevinirim.

Şimdi devam…

Önceki Sayfa   Sonraki Sayfa

Leave a Reply