C Makroslar

Makros tushunchasi. Makros ta’rifiga ko’ra bir jumlani ikkinchi jumla bilan almashtirishdir. Makroslar ko’pincha makro ta’rif deb ham ataladi. Eng sodda makro ta’rif

# define  identifikator almashtiruvchi satr.

Bu direktiva yordamida foydalanuvchi asosiy turlar uchun yangi nomlar kiritishi mumkin. Masalan:

# define real long double

Dastur matnida long double turidagi o’zgaruvchilarni real sifatida ta’riflash mumkin. Parametrli makrota’riflardan foydalanish yanada kengroq imkoniyatlar yaratadi:

# define nom (parametrlar ro’yxati) almashtiriluvchi_qator

Bu yerda nom – makros nomi. Parametrlar ro’yxati – vergul bilan ajratilgan identifikatorlar ro’yxati. Makro ta’rifning klassik misoli :

# define max (a,b) (a<b ? b:a)

Bu makrosdan foydalanganda kompilyator max (a,b) ifodani (x<a ? y:x) ifoda bilan almashtiradi.

Yana bir misol:

# define ABS(x) (x<0 ? –(x):x)

Misol uchun dasturdagi ABS(E-Z) ifoda (E-Z<0 ? (E-Z):E-Z) ifoda bilan almashtiriladi. Makroslarning funksiyadan farqi. Funksiya dasturda bitta nusxada bo’lsa, makros hosil qiluvchi matnlar makros har gal chaqirilganda dasturga joylashtiriladi. Funksiya parametrlar spesifikasiyasida ko’rsatilgan turlar uchun ishlatiladi va konkret turdagi qiymat qaytaradi. Makros har qanday turdagi parametrlar bilan ishlaydi. Hosil qilinayotgan qiymat turi faqat parametrlar turlari va ifodalarga bog’liq. Makrojoylashlardan to’g’ri foydalanish uchun almashtiriluvchi satrni qavsga olish foydalidir. Funksiyaning haqiqiy parametrlari bu ifodalardir, makros argumentlari bo’lsa vergul bilan ajratilgan leksemalardir. Argumentlarga makro-kengaytirishlar qo’llanmaydi. Almashtiruvchi katorda preprosessor amallari. Almashtiruvchi qatorni tashkil qiluvchi leksemalar ketma-ketligida ‘#’ va ‘##’ amallarini qo’llash mumkin. Birinchi amal parametr oldiga qo’yilib, shu parametrni almashtiruvchi qator qavslarga olinishi kerakligini ko’rsatadi. Misol uchun:

#define print(A) printf(#A” = %f”,A)

makro ta’rif berilgan bo’lsin. U holda makrosga print(a+b); murojaat quyidagi makro kengaytmani hosil qiladi:

print(“a+b””%f”,a+b); 

Ikkinchi ‘##’ amal leksemalar orasida qo’llanilib, leksemalarni ulashga imkon beradi. Quyidagi makro ta’rif berilgan bo’lsin:

#define zero(a,b,c) (bac)
#define one(a,b,c) (b a c)
#define two(a,b,c) (b##a##c)

Makro chaqiriq: Makrojoylash natijasi:

Zero(+,x,y) (bac) 
One(+, x, y) (x + y)
Two(+,x,y) (x+y)

Birinchi holda bac yagona identifikator deb karalib makroalmashtirish amalga oshirilmaydi. Ikkinchi holda makros argumentlari bo’shliq belgilari bilan ajratilgan bo’lib bu belgilar natijada ham saqlanib qoladi. Uchinchi holda makros uchun ‘##’ amali qo’llanilgani uchun natijada bo’shliq belgilarsiz parametrlar ulanadi. Oldindan kiritilgan makronomlar. Prosessorga qayta ishlash jarayonida ma’lumot beruvchi quyidagi oldindan kiritilgan makronomlar mavjuddir. ..LINE.. – qiymati o’nlik konstanta o’qilayotgan satr nomeri. Birinchi satr nomeri 1 ga teng. ..FILE.. – fayl nomi simvollar qatori sifatida. Preprosessor har gal boshqa fayl nomi ko’rsatilgan #include direktivasini uchratganda nom o’zgaradi. #include direktivasi bajarilib bo’lgandan so’ng nom qayta tiklanadi. ..DATE.. – “Oy, sana, yil” formatidagi simvollar satri. Fayl bilan ishlash boshlangan sanani ko’rsatadi. ..TIME.. – “Soatlar : minutlar : sekundlar ” formatidagi simvollar satri. Preprosessor tomonidan faylni o’qish boshlangan vaqtni ko’rsatadi. ..STDC.. – Agar kompilyator ANSI – standart bo’yicha ishlayotgan bo’lsa qiymati 1 ga teng konstanta. Aks holda konstanta qiymati aniqlanmagan.