Bu site emekli olmuştur. Arşiv amaçlı olarak
BT AKADEMİ
sponsorluğunda yayın hayatına devam etmektedir.
Ana Sayfa
.net TV
Makaleler
Kaynak Kod
Haberler
Serbest Köşe
Canlı Köşe
Forum
C#nedir?
Ekibimiz
RSS
ADO.NET/SQL
C / Sys Prog.
Genel
Mono ve .NET
Silverlight
XML / Web Serv.
X86 Assembly
C++ / C++.NET
J#.NET / Java
.NET 3.x
UML / Analiz
Yazılım Müh.
ASP.NET
C# / VC#/.NET
Mobil Prog.
PHP 5
YAZAR HAKKINDA
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ı
:
35256
Yorum Sayısı
:
2
yorum yaz
SİTE İÇİ ARAMA
Ü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.
C#nedir? hesabınız yok mu?
Üye olabilmek için
tıklayın
.
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.
Silindi
emre TAŞ
yazının devamı >
silindi
emre TAŞ
yazının devamı >
silindi
emre TAŞ
yazının devamı >
silindi
emre TAŞ
yazının devamı >
silindi
emre TAŞ
yazının devamı >
Bende Yazmak İstiyorum
Blogroll
Turhal Temizer
Conda install environment.yml Package
26.12.2024
Turhal Temizer
Mac OS/X Removing CUDA
26.12.2024
Burak Selim Şenyurt
Rust ile ECS Yaklaşımını Anlamak
26.12.2024
Burak Selim Şenyurt
Birlikte Rust Öğrenelim Serisi
26.12.2024
Diğer Herşey
»
Makaleler RSS
»
Video Gönder
»
Makale Gönder
»
Serbest Köşeye Yazı Gönder
»
Yazar Başvurusu
»
C#nedir? Ekibinde Olmalıyım!
Sponsorlar
Ana Sayfa
/
Makaleler
/
C / Sys Prog.
/
Önişlemci(preproccessor) Komutlarının Kullanımı
Önişlemci(preproccessor) Komutlarının Kullanımı
Favorilerime Ekle
Gönderiliyor lütfen bekleyin...
arkadaşıma gönder
Arkadaşınızın email adresi:
*
Mesajınız:
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
Kutbettin Yesilay
/
üye hakkında
typedef bir önislemci komutu degildir. typedef ile yeni bir tip tanimlamasi yapilir.
KAS
20
2002
İhsan Algan
/
üye hakkında
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
Dizayn ve Kodlama
bt
akademi
. Tüm Hakları Saklıdır © Copyright 2002-2009 c#nedir?com
Makaleler
Serbest Köşe
Makale Gönder
.Net TV
Video Gönder
Canlı Köşe
Kaynak Kod
Forum
Haberler
Röportajlar
Anketler
C# Nedir?
İletişim
Site Haritası
RSS
Favorilere Ekle
Üyelik
Hesap Aktivasyon
Ekibimiz
Ekibe Katıl