08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

C ve Sistem Programcıları Derneği - C Ders Notları - Necati Ergin<br />

x = kare(y);<br />

Şüphesiz, böyle bir deyimde makro kullanılmış olur. Çünkü önişlemci, program kodunu<br />

derleyici programdan daha önce ele alır. Derleyiciye sıra geldiğinde, önişlemci zaten ilgili<br />

makro için yer değiştirme işlemini tamamlamış olur. Ancak makro yerine işlev çağrısını<br />

seçmek için iki yöntem kullanılabilir.<br />

1. #undef önişlemci komutu kullanılarak makro tanımı ortadan kaldırılabilir:<br />

#undef kare<br />

x = kare(y);<br />

Önişlemci program #undef konutuyla karşılaştığında makro tanımını ortadan kaldırır ve<br />

izleyen satırlarda kare ismini gördüğünde bir yer değiştirme işlemi yapmaz.<br />

2. kare ismi ayraç içine alınarak makro devre dışı bırakılabilir<br />

x = (kare)(y);<br />

Bu durumda kare ismini izleyen ilk atom, açılan ayraç "(" karakteri olmadığından,<br />

önişlemci program yer değiştirme işlemi yapmaz. Ancak işlev çağrısını engelleyen bir<br />

durum söz konusu değildir. İşlev isminin bir adres belirttiğini biliyorsunuz. Yukarıdaki<br />

ifade ile işlev adresine dönüştürülecek olan kare ismi öncelik ayracı içine alınmıştır.<br />

3. Bir işlev, bir işlev göstericisi kullanılarak çağrılabilir:<br />

int kare(int);<br />

void func()<br />

{<br />

int (*fp)(int) = &kare;<br />

fp();<br />

}<br />

Derleyiciler, standart kütüphaneye ilişkin işlevleri aynı zamanda makro olarak da<br />

tanımlayabilirler. Örneğin derleyicilerin çoğu cytpe.h başlık dosyasında bildirilen karakter<br />

test işlevlerini aynı zamanda makro olarak tanımlar.<br />

Makrolar ile İşlevler Arasındaki Farklar<br />

1. Makrolar çoğu zaman aynı işi yapan işleve göre daha hızlı çalışan bir kodun<br />

üretilmesine neden olurlar. Zaten makroların kullanıldığı durumlarda hedeflenen de<br />

budur.<br />

2. Makrolar, her kullanıldığı yerde önişlemci tarafından açıldığı için, çoğunlukla kaynak<br />

kodu büyütür. Kaynak kodun büyüdüğü durumların çoğunda, çalıştırılabilir dosyanın<br />

boyutu da büyür. Ancak bir işlev kaç kez çağrılırsa çağrılsın, o işlevin tanımı kaynak kod<br />

içinde bir kez yer alır.<br />

3. Makro paremetreleri makro açılımı içinde birden fazla kullanılıyor ise makro açılımı<br />

sonucu istenmeyen durumlar oluşabilir. Makro argümanı olarak kullanılan ifadenin bir yan<br />

etkiye sahip olması durmunda bu yan etki birden fazla kez oluşur. Ancak işlevler söz<br />

konusu olduğunda böyle bir risk söz konusu değildir.<br />

4. Bir işlevin adresi işlev göstericilerinde tutularak bazı işlemler gerçekleştirilebilir. Ancak<br />

bir makronun adresi olmaz.<br />

5. Bir makro söz konusu olduğunda önişlemci program, makroya verilen argümanların<br />

sayısı ile makro parametrelerinin sayısının uyumunu kontrol edebilir. Ancak önişlemci<br />

491

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!