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

program makro argümanlarıyla makro parametrelerinin tür açısından uyumunu kontrol<br />

edemez, makrolar türden bağımsızdır. Ancak işlevler türlere ilişkin yazıldığından<br />

derleyicinin yapacağı tür kontrollerine tabidir. Derleyici işleve gönderilen argümanlarla<br />

işlev parametrelerinin türlerinin uyumsuz olması durumunda hata ya da uyarı iletisi<br />

üretebilir.<br />

Makro Açılımlarının Alt Satırdan Devam Etmesi<br />

Bir makro açılım listesinin yazımı makronun tanımlandığı satırda sonlanmak zorunda<br />

değildir. Makro açılım listesinin yazımı alt satırdan devam edebilir. Bunun için alt satıra<br />

geçmeden önce ters bölü karakteri '\' kullanılır.<br />

Makrolar ile İşlev Kalıbı Oluşturulması<br />

Makrolar kullanılarak işlev kalıbı hazırlanabilir. Aşağıdaki örnekte bir dizinin en büyük<br />

elemanını bulan bir işlev kalıbı hazırlanıyor:<br />

#include <br />

#define generic_max(T) T getmax_##T(const T *ptr, size_t size) {\<br />

int k; T max = *ptr; for (k = 1; k < size; ++k)\<br />

if (ptr[k] > max) max = ptr[k]; return max;}<br />

generic_max(int)<br />

generic_max(double)<br />

int main()<br />

{<br />

int a[10] = {1, 4, 5, 7, 8, 9, 10, 2, 3, 6};<br />

double b[10] = {1.2, 3.5, 7.8, 2.4, 4.4, .7, 3.2, 4.8, 2.9, 1.};<br />

printf("a dizisinin en buyuk elemani = %d\n", getmax_int(a, 10));<br />

printf("b dizisinin en buyuk elemani = %lf\n", getmax_double(b, 10));<br />

}<br />

return 0;<br />

generic_max isimli makronun tanımında makro parametresi olarak T isminin kullanıldığını<br />

görüyorsunuz. Bu isim bir tür bilgisi olarak kullanılıyor. Önişlemci atom birleştirme<br />

işleciyle, makro açılımı sonucunda farklı işlev isimleri elde edilir.<br />

Makro Açılımında Makro İsminin Kullanılması<br />

Bir makro ismi ya da bir simgesel değişmez, değiştirme listesinde yer alabilir. Bu duruma<br />

İngilizcede "self referential macro" denmektedir. Eğer açılım listesinde makronun kendi<br />

ismi yer alırsa önişlemci özyinelemeli bir yer değiştirme işlemi yapmaz.<br />

Aşağıdaki örneği inceleyin:<br />

#definemax (4 + max)<br />

max isminin programın içinde kullanılan bir başka değişkenin ismi olduğunu düşünelim.<br />

x = max;<br />

Önişlemci program yukarıdaki deyimin üzerinden geçtiğinde bu deyimi<br />

x = 4 + max;<br />

biçimine dönüştürür. Ve daha sonra artık max ismini yine yer değiştirme işlemine<br />

sokmaz.<br />

492

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

Saved successfully!

Ooh no, something went wrong!