C++ Preprocessor (Ön işleyici)

    Pre-processor derleyicinin önemli bir parçasıdır. Ben pre-processorün  bize yazdığınız kodu derlemeye başladığınızda şunu dediğini düşünüyorum:  evet sen bu kodu yazdın ama bu kodu hem performans açısından hem de verimlilik açısından bir kontrol edelim, gerekli değişiklikleri yapalım, işe yaramaz kısımları atalım, bu arada bana makrolarla bildirdiğin direktifleri de yerine getireceğim. Yaptığı iş tam olarak budur, ancak işin kötü tarafı neler yaptığını neleri düzenlediğini bizimle paylaşmıyor maalesef,  paylaşıyor olsaydı daha güzel bir programlama dünyasına sahip olabilirdik :)
    Peki bu bahsettiği makro direktifleri nelerdir? Yeni bir satırda # hash, sharp diez ne derseniz artık işaretiyle başlarlar.

    #define ZERO 0 

    define bunlardan biridir, preprocessor bu direktifle kodunuz içerisinde ZERO deyimini arar ve bulduğu heryerde 0 ile değiştirir. Değişken tanımlar gibi eşittir kullanmadığımıza ve satır sonunda noktalı virgül kullanmadığımıza dikkat edin. kullanırsak onu da kopyalayacağından şüpheniz olmasın :)

    #include <iostream>

   include içerisinde yazdığınız dosyayı açar, tüm içeriğini kopyalar ve tam olarak include direktifini kullandığınız yere yapıştırır.

int kosul = 1;
#if kosul == true
//koşul sağlanıyorsa yapılacaklar
#else
//koşul sağlanmıyorsa yapılacaklar
#endif

Şimdi burada dikkat etmenizi istediğim birkaç şey var, öncelikle koşulun sağlanıp sağlanmadığını renklerden ayırt edebilmeniz, aktif olduğu belli olan kısım else kısmı, yani VS bize burada söz konusu koşulun sağlanmadığını ve hangi kod bloğunun yürütüleceğini gösteriyor. İkincisi bir satır yukarda int kosul diye bişey tanımlamışız ve 1 demişiz öyleyse koşul true gibi duruyor neden sağlanmamış olabilir? Pre-processor de işler biraz daha farklı yürüyor, buradaki koşul runtime da kullanılan bir değişkenden çok pre-precessing time içerisinde tanımlanan ifadelere göre işlem yapıyor yani değişken değil #define kullanmak gerekiyor. Yani şöyle olsaydı :

#define kosul 1;
#if kosul == true
//koşul sağlanıyorsa yapılacaklar
#else
//koşul sağlanmıyorsa yapılacaklar
#endif

kosul diye bişeyi hiç tanımlamasaydık nasıl davranırdı? false olarak kabul eder ve else bloğunu işlerdi, copy-paste olayı burda da geçerlidir. Pre-processor hangi koşul geçerliyse oradaki kod bloğunu alır (tüm if bloğunun tamamnın yazıldığı yere yapıştırır.) Yukardaki durum için #if ile başlayıp #endif ile biten tüm satırlar silinip yerine //koşul sağlanıyorsa yapılacaklar kısmı yapıştırılıyor olacak, tabi yorum yerine bir kod yazmış olsaydık. Dikkatinizi çekmekte fayda görüyorum: yalın kullanılan if ile karıştırmayın #if.

    Bir de benim de sıklıkla cross-platform kütüphaneler yazdığımda severek kullandığım iyi ki var dediğim bir diğer tanımlama da #ifdef tanımlamasıdır :

int main() 
{
#ifdef WIN32
	std::cout << "Merhaba Dünya" << std::endl;
#endif
#ifdef ARDUINO
	Serial.println("Merhaba Dünya");
#endif
}

Bu kodu win32 sistemde çalıştırdığınızda std::cout kullanır, arduino ile kullandığınızda Serial.println kullanır.

Sonraki Konu : 


Yorumlar

Bu blogdaki popüler yayınlar

Arduino IDE Kod Satır Numaraları Nasıl Açılır

DMD2TUR | Arduino P10 Led Panel için Türkçe Karakter Desteği | Arduino P10 Led panel Türkçe yazı yazma

P10 Led Panel Nasıl Sürülür - Arduino kod