Önişlemci(preproccessor) Komutlarının Kullanımı
C ve C++ ile yazılmış hemen hemen tüm programlarda önişlemci komutlarını görürüz, bu yazıda önişlemci komutlarını ve kullanım amaçlarını inceleyeceğiz.Ön işlemci komutu ne demektir? Önişlemci komutları, kaynak kodun derleme modülüne verilmeden önce kaynakkodla ilgili yapılmak istenen ön işlemleriri belirtmek için kullanılan komutlarıdr. Önişlemci komutlarının derleme modülü ile hiç bir alakası yoktur. Önişlemci dediğimiz modül bu komutları değerlendirip işleme sokarak kaynak kodu derleme modülüne verir. Mesela Geometrik şekillerin alanlarını veya onların bir takım özelliklerini bulmak için C ile bir kütüphane geliştirmek istiyorsunuz. Hemen hemen bütün geometrik şekillerde pi sayısının kullanıldığını tahmin edebilirsiniz. pi sayısının her lazım olduğu yerde 3.14 sayısını kullanmak yerine genel bir pi sayısı tanımlarsak pi sayısını istediğimiz gibi değiştirebiliriz.Eğer her pi lazım olduğunda değeri ile kullansaydık pi sayısını değiştirmek istediğimizde kaynak kodda bütün 3.14 geçen yerleri tek tek değiştirmemiz gerekecekti, halbuki eğer genel bir tanımlama yapmış olsaydık pi yi tek bir yerde değiştirmemiz yetecekti. En cok kullanılan ön işlemci komutlarından #define bu işi yapmamız için tasarlanmıştır.
En çok karşımıza çıkan ön işlemci komutu sizinde tahmin ettiğiniz gibi #include önişlemci komutudur. Aşağıda C dilinde bulunan ön işlemci komutları ve açıklamaları bulunmaktadır.
#include önişlemci komutu
Kaynak koda standart bir takım başlık dosyalarını veya kendi fonksiyonlarımızla ilgili prototip bilgilerin içeren dosyaları eklemek için kullanılan önişlemci komutudur. İki tip kuıllanımı vardır.
#include <stdio.h> // Komut böyle kullanılırsa derleyicinin varsayılan olarak belirlediği kalsörlerde stdio.h dosyası aranır bulunursa kaynak koda eklenir ve kod derleme modülüne iletilir.Eğer stdio.h dosyası bulunamaz ise derleme zamanında hata alırız. Bu şekilde ki kullanımı genellikle standart başlık dosyalarını kaynak koda eklemek istediğimiz zamana kullanırız.
#include "bizim_baslik.h" // Bu şekildeki kullanımda programızın derleme sırasında hangi klasörde bulunuyorsa arama işlemi o kalsörde olur. bizim_baslik.h dosyasının "c:izim_baslik.h" gibi tam adresini de vererek bu işlemi gerçekleştirmiş oluruz. Ancak bu şekilde ki bir kullanım kaynak kodun taşınabilirliğini azalttığı için kullanımı pek tavsiye edilmez.
#define önişlemci komutu
#define önişlemci komutu #include önişlemci komutu gibi hemen hemen bütün profesyonel uygulamada gördüğümüz bir komuttur. #define önişlemci komutu kaynak kod içerisinde deyim yerindeyse metinsel bir değişiklik yapar.#define ön işlemci komutunun kullanımı aşağıdaki gibidir.
#define pi 3.14
Bunun anlamı şudur : Kaynak kod içersinde pi gördüğün yere 3.14 yaz(#define komutundan sonra gelen ilk boşulktan sonraki sözcuk yerine o sözcükten sonra gelen ilk boşluk ile satır sonuna kadar olan sozcuğü yer değiştir). Kaynak kod derlenmeye başlamadan önce bütün pi ler yerine 3.14 yazılır ve o şekilde derleme mödülüne iletilir. Gördüğünüz gibi #define önişlemci komutunun metinsel yer değiştirme dışında yaptığı hiç birşey yoktur.Aşağıda #define ve #include önişlemci komutuna bir örnek verilmiştir.
#include <stdio.h>
#include <math.h>
#define PI 3.14
int main(void)
{
double x ;
double y ;
double z ;
x= 100 ;
y = sqrt(x);
z = y * PI;
return 0;
}
Yukarıdaki kodda derleme işlemi başlamadan ön işlemci komutları çalıştırılarak gerekli metin değiştirme işlemleri yapılır ve eklenecek başlık dosyaları eklenir.
Not: #define ön işlemci komutunu aynı ifade ile aşağıdaki gibi iki defa kullanılırsa derleme zamanında hataya yol açmaz. Ama uyarı hatası alırız.Bu durumda hangi sembolik değerin kullanılacağı ile ilgili herhangi bir standart yoktur.Ama genellikle derleyiciler ikinci tanımlanan yere kadar ilkini sonrada ikincisini kullanırlar. Taşınabilirlik açısından böyle bir kullanıma ihtiyaç duyduğumuzda #undef komutuyla önce eski tanımlama silinir sonra yeni tanımlama yapılır.#undef komutuyla ilgili detaylı bilgi aşağıda verilecektir.
#define PI 3.14
#define PI 3.147 //Uyarı
#Aynı şekilde içinde aynı ifadenin define edilmiş değeri bulunan iki farklı başlık dosyasını include etmek yine derleme zamanında hata verecektir. Bu sorunun önüne geçmek için koşullu derlemeye ilişkin önişlemci komutları kullanılır.
|