Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Sefer Algan
Sefer Algan
http://www.seferalgan.com
İletişme geçmek için tıklayın.
71 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler:  C / Sys Prog. Sefer Algan
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Başlangıç
Kategori : C / Sys Prog.
Yayınlanma Tarihi : 22.11.2002
Okunma Sayısı : 33563
Yorum Sayısı : 2     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 16.4.2024
Turhal Temizer
Mac OS/X Removing CUDA 16.4.2024
Burak Selim Şenyurt
Kurumsal Yazılımcının Oyun Geliştirme ile İmtihanı 16.4.2024
Burak Selim Şenyurt
Matematik ve Oyun Programlama - Missile Command - Final 16.4.2024
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
Önişlemci(preproccessor) Komutlarının Kullanımı
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
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:\bizim_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.

#if ve #elif önişlemci komutları

#if önişlemci komutu koşullu derleme ile alakalı komutlardır.Bunun dışında #ifdef ve #ifndef önişlemci komutları vardır. Koşullu derleme ile karşılaşan önişlemci, koşulunu sağlanaıp sağlanmamsına göre bazı blokları derleme modülüne vermez. Böylece iki defa define edilmiş ifadelerin oluşturacağı hatayı koşullu derleme önişlemci komutlarıyla engelleyebiliriz.

#if önişlemci komutunun genel yapısı aşağıdaki gibidir.Aşağıda da görüldüğü gibi #if önişlemci komutu tek başına kullanılamaz. #else ve #endif komutlarıyla birlikte kullanılır.

#if <sabit ifadesi>
...
...
#else
...
...
#endif

Sabit ifadesinin değeri sıfır dışı bir değer ise sabit ifadesi doğru olarak değerlndrilecek ve birinci blok derleme modülüne verilecektir, eğer değer sıfırsa ise #else ile #endif arasındaki blok derlemeye katılacaktır.#if komutunun sağındaki sabit ifadesi operatör içerebilir ancak herhangi bir değişken içeremez.Aşağıda #if önişlemci komutunu bir örnek verilmiştir.



#define MAX 60
#define MIN 10

#if MAX > 100
....
#else
         #if MIN < 20
         ....
         #endif
#endif
Yukarıda oluşturulan #if - #else merdivenini daha okunabilir hale getirmek için yeni bir önişlemci komutu kullanırız.Bu komut #elif önişlemci komutudur.Ancak bu durumda iki tane #endif komutu yerine bir tane #endif komutu kullanırız.Yani dışardaki #if komutu ve #elif komutuna ait #endif komutları ortak olmak zorundadır.#elif önişlemci komutunu kullanarak yukarıdaki kodu aşağıdaki gibi değiştirebiliriz.Anlam olarak ikiside ayndır.


#define MAX 60
#define MIN 10

#if MAX > 100
....
#elif MIN < 20
....
#endif
#ifdef ve #ifndef önişlemci komutları

Bir sembolik sabitin(define edilmiş ifade) tanımlanıp tanımlanmadığı durumlara göre farklı blokları derleme mödülüne vermek için kullanılırlar. Aşağıdaki örneğe bakarsak;



#define MAX 60

#ifdef MAX
....(1.blok)
#else
....(2.blok)
#endif
Eğer MAX sembolik sabiti tanımlanmışsa 1.blok eğer tanımlanmamışsa 2.blok derleme modülüne iletilecektir.Mesele MAX sembolik sabiti bize illaki lazımsa 2. blok içinde #define MAX 60 diğerek eğer sembolik sabit tanımlanmamışsa burda tanımlarız.
#ifndef komutuda #ifdef komutunun tam tersidir.Yani sembolik sabit tanımlanmamışsa 1.blok tanımlanmışsa 2. blok derleme modülüne iletilir.Aşağıdaki örnekte MAX sembolik sabiti tanımlanmamışsa tanımlanıyor.

#ifndef MAX
#define MAX 100
#endif

defined() önişlemci operatörü

Okunabilirliği artırmak amacıyal kullanabilen bir önişlemci operatörüdür. Aşağıdaki şekilde kullanılır.

#if defined(MAX)
...
#endif

Eğer MAX tanımlanmışsa operatör 1 değerini üreteceği için altındaki blok derleme modülüne verilecektir.Aksi halde verilmeyecektir.Bu şekilde bir kullanımı #ifdef önişlemci komutuyla da yapabilirdik.#ifdef ile aşağıdaki gibi olurdu.

#ifdef MAX
...
#endif

NOT : Koşullu derlemeye ilişkin önişlemci komutlarının bir çok kullanım alanı vardır.Bunlardan en öenmlisi bir başlık dosyasını birden fazla kaynak koda eklenmesini engellemektir. Aynı dosya #include önişlemci komutuyla kaynak koda eklenmemelidir.Çünkü başlık dosylarında bulunan fonksiyon prototpileri,sembolik sabitler veya tanımlanan yapılar kaynak kod içerisinde iki defa görülürse derleme aşamasında hata olur. Bu yüzden her başlık dosyasında başlık dosyasına has bir sembolik sabit tanımalanarak #ifdef komutuyla bu sembolik sabitin tanımlanıp tanımlanmadığı kontrol edilir. Eğer tanımlanmamışsa istenilen başlık dosyası iclude edilir, aksi halde edilmez. Diğer bir kullanım alanı ise derleyiceye göre farklı derleme işlemleri yapılacaksa koşullu derleme komutları kullanılır. Mesela bazı durumlarda derleyice özgün fonksiyonlar kullanırız bu durumda kaynak kodumuzun taşınabilirliğini sağlamamız için kaynak kodun o sadecebölümünün ilgili derleyicinin derleme modülüne gönderilmesi gerekir.Diğer bir kullanım alanı ise işletim sistemlerine göre değişik derleme yapılacaksa bu komutlar kullanılır.

#undef önişlemci operatörü

Bir sembolik sabitin tanımlanmasını ortadan kaldırmak için kullanılır. Bir sembolik sabiti ikinci defa tanımlamak istiyorsan #undef komutunu kullanmalıyız.

#define MAX 30
#undef MAX
#define MAX 20

Bu durumda derleyici hiç bir hata ve uyarı vermeden derleme işine devam eder. İşin ilginç tarafı henüz tanımlanmamış bir sembolik sabitine bile #undef komutunu uygulayabiliriz.Bu durum ne bir hataya sebep olur nede derleyici tarafından uyarı verilir.

#error önişlemci operatörü

Önişlemcinin derleme işlemini bitirmesi için kullanılan bir komuttur. Kullanımı aşağıdaki gibidir.

#ifdef _MSN_
#error Derleme İşlemi Gerçekleşemez
#end if

#error komutu ile karşılaşılında önişlemci derlemeyi durduru ve #error komutundan sonra gelen yazıyı hata mesajı olarak yazar.


Önişlemci komutlarını bitirdikten sonra önceden tanımalanmış standart bir takım senbolik sabitlerden birkaçına size fikir verebilmesi için değinmek istiyorum.

__LINE__ : Önişlemci kaynak kodda bu satırı görünce, __LINE__ yerine o anda kaynak kodda bulunulan satır numarası yazılır.

__FILE__ : Bu sabit yerine tırnak içiersinde dosyanın ismi yazılır.

__DATE__ : Önişlemci bu sabitin yerine derlemenin yapıldığı tarihi yazar (aa gg yyyy)

__TIME__ : Derleme işlemininyapıldığı saat yazılır. (ss:dd:ss)

Yukarıdaki sembolik sabitlerin görüntülerini incelemek için bir test kodu yazıp görmenizi öneririm.

Makale:
Önişlemci(preproccessor) Komutlarının Kullanımı C ve Sistem Programlama Sefer Algan
  • Yazılan Yorumlar
  • Yorum Yaz
MAR
11
2003
typedef bir önislemci komutu degildir. typedef ile yeni bir tip tanimlamasi yapilir.
KAS
20
2002
peki typedef de bir önişlemci komutu değilmi
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor