08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

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

olmadığı derleyici tarafından sınanır. Ayrıca işleve gönderilen argümanların türü ile işlevin<br />

ilgili parametre değişkeninin türlerinin uyumlu olup olmadığı da derleyici tarafından<br />

sınanır.<br />

Şimdi de işlev çağrısı yapmak yerine işlevin kodunu doğrudan yazmak durumunda elde<br />

edilebilecek avantajların ne olabileceğine bakalım:<br />

Bir işleve yapılan çağrının işlemci zamanı ve bellek kullanımı açısından ek bir maliyeti<br />

vardır. İşleve giriş ve işlevden çıkış kodlarının yürütülmesi için ek makina komutlarının<br />

yürütülmesi gerekir. Varsa işlevin parametre değişkenleri de, işlev çağırıldığında bellekte<br />

yer kaplar. Özellikle kaynak kodu çok kısa, kaynak dosya içinde çok çağrılan işlevler için,<br />

çoğu durumda bu maliyetin ödenmesi istenmez.<br />

İşlev çağrısı yapmak yerine kod açık bir biçimde yazılırsa, derleyici kodun bulunduğu yere<br />

bağlı olarak daha verimli bir eniyileme (optimizasyon) gerçekleştirebilir.<br />

Makro Nedir<br />

Makro, işlev tanımlamadan işlev çağrısının getirdiği bazı avantajlardan yararlanılmasını<br />

sağlayan bir araçtır. Ortada gerçek bir işlev tanımı söz konusu olmadığından, işlev için<br />

ödenen bir ek gider de söz konusu değildir.<br />

Makrolar, önişlemci programın #define komutu ile tanımlanır. Bir makro tanımı, önişlemci<br />

programa verilen parametrik bir yer değiştirme komutudur.<br />

#defineMAX(X, Y) ((x )> (y) ? (x) :(y))<br />

MAX, tanımlanan makronun ismidir. Bu ismi "açılan ayraç" karakteri izlemelidir.<br />

Makro ismini izleyen ayraç içinde, virgüllerle ayrılarak bildirilen isimlere "makro<br />

parametreleri" denir. Kapanan ayracı izleyen boşluktan sonra gelen atomlar "makro yer<br />

değiştirme listesi"dir. Yer değiştirme listesinde, makro parametreleri istenildiği kadar<br />

istenildiği sıra ile kullanılabilir.<br />

Önişlemci program kaynak kodun izleyen kesiminde MAX ismi ile karşılaştığında, ayraç<br />

içindeki ifadeleri makro argümanı olarak kabul eder. Makro tanımında bulunan yer<br />

değiştirme listesinde makro parametreleri nasıl kullanılmışsa, makro çağrısının bulunduğu<br />

yerlerde benzer bir yer değiştirme işlemi yapılır. Aşağıdaki kodu inceleyin:<br />

#include <br />

#define ISEVEN(a) (!((a) & 1))<br />

#define MAX(a, b) ((a) > (b) ? (a) : (b))<br />

int main()<br />

{<br />

int x, y;<br />

printf("iki sayi giriniz :");<br />

scanf("%d%d", &x, &y);<br />

if (ISEVEN(x))<br />

printf("%d cift sayi!\n", x);<br />

else<br />

printf("%d tek sayi!\n", x);<br />

printf("%d ve %d sayilarindan buyugu = %d\n", x, y, MAX(x, y));<br />

}<br />

return 0;<br />

Yukarıdaki main işlevinde, ismi ISEVEN ve MAX olan iki makro tanımlanıyor. Önişlemci<br />

makro tanımının üzerinden geçtikten sonra<br />

if (ISEVEN(x))<br />

486

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

Saved successfully!

Ooh no, something went wrong!