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 />

satırı ile karşılaştığında, ISEVEN isminin daha önce tanımlanan makroya ait olduğunu ve<br />

makro argümanı olarak x atomunun kullanıldığını anlar. Önişlemci program ilgili yer<br />

değiştirme işlemini yaptığında bu satır aşağıdaki biçime dönüşür:<br />

if ((!((x) & 1)))<br />

Benzer şekilde<br />

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

satırı da MAX isimli makronun önişlemci program tarafından açılması sonucu<br />

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

(y)));<br />

haline getirilir.<br />

Güvenli Makro Yazmak<br />

Aşağıdaki makroyu inceleyin:<br />

#define Kare(x)<br />

x * x<br />

Kaynak kod içinde bu makro aşağıdaki gibi kullanılmış olsun:<br />

void func()<br />

{<br />

int a = 10;<br />

int b;<br />

}<br />

b = Kare(a + 5);<br />

/***/<br />

Kare eğer bir işlev olsaydı, işleve gönderilen argüman olan a + 5 ifadesinin önce değeri<br />

hesaplanırdı. Argüman olan ifadenin değeri 15 olduğu için çağrılan işlev 225 değerine geri<br />

dönerdi. Ancak önişlemci program aşağıdaki gibi bir yer değiştirme işlemi yapar:<br />

b = a + 5 * a + 5;<br />

Çarpma işleci toplama işlecine göre daha yüksek öncelikli olduğu için burada b<br />

değişkenine atanacak değer 65 olur, değil mi? Bu tür öncelik sorunlarını çözmek amacıyla<br />

makro parametreleri, açılım listesinde ayraç içine alınmalıdır:<br />

#define Kare(x)<br />

(x) * (x)<br />

Bu kez aynı ifade önişlemci tarafından aşağıdaki gibi açılır:<br />

b = (a + 5) * (a + 5);<br />

b değişkenine atanan değer 225 olur. Ancak şimdi de makronun aşağıdaki gibi<br />

kullanıldığını düşünün:<br />

b = 100 / Kare(a);<br />

Kare işlev olsadı b değişkenine 1 değeri atanırdı değil mi? Ancak yukarıdaki makro<br />

önişlemci tarafından<br />

b = 100 / (a) *( a);<br />

487

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

Saved successfully!

Ooh no, something went wrong!