Makroslar (macros) — preprosessor orqali kod parchasini yoki hisob-kitobni almashtiradigan vosita. Oddiy #define doimiy yaratsa, makros parametr qabul qilib, kichik “funksiyaga o’xshash” ifodalarni almashtiradi. Ular tez ishlaydi, chunki funksiya chaqiruvi bo’lmasdan, to’g’ridan-to’g’ri kodga qo’yiladi.
Makros (macro) —
#definebilan yaratiladigan, parametr qabul qila oladigan preprosessor almashtirmasi. U kompilyatsiyadan oldin kodga to’g’ridan-to’g’ri joylashtiriladi.
Oddiy makros
Parametrsiz makros — bu oddiy doimiy almashtirish:
#include <stdio.h>
#define MAX 100
int main(void) {
printf("Maksimal: %d\n", MAX);
return 0;
}
Maksimal: 100
Bu — oddiy #define doimiy. Endi parametrli, funksiyaga o’xshash makroslarni ko’ramiz.
Parametrli makros
Makros parametr qabul qilib, kichik hisob-kitobni bajarishi mumkin:
#include <stdio.h>
#define KVADRAT(x) ((x) * (x))
#define KATTA(a, b) ((a) > (b) ? (a) : (b))
int main(void) {
printf("5 ning kvadrati: %d\n", KVADRAT(5));
printf("Katta son: %d\n", KATTA(10, 7));
return 0;
}
5 ning kvadrati: 25
Katta son: 10
KVADRAT(5) kompilyatsiyadan oldin ((5) * (5)) ga almashadi. KATTA esa ikki sondan kattasini qaytaradi. Bular funksiyaga o’xshaydi, ammo funksiya chaqiruvisiz ishlaydi.
Qavslar muhimligi
Makroslarda qavslar juda muhim. Ularsiz operator ustuvorligi tufayli xato natija chiqishi mumkin:
#include <stdio.h>
#define NOTOGRI(x) x * x
#define TOGRI(x) ((x) * (x))
int main(void) {
printf("Noto'g'ri: %d\n", NOTOGRI(2 + 3)); /* 2 + 3 * 2 + 3 */
printf("To'g'ri: %d\n", TOGRI(2 + 3)); /* ((2+3)*(2+3)) */
return 0;
}
Noto'g'ri: 11
To'g'ri: 25
NOTOGRI(2 + 3) 2 + 3 * 2 + 3 = 11 ga aylandi (kutilmagan!), TOGRI esa qavslar tufayli to’g’ri 25 berdi. Shuning uchun makrosda har bir parametrni qavsga oling.
Makros va funksiya farqi
Ikkovini jadvalda solishtiramiz:
| Xususiyat | Makros | Funksiya |
|---|---|---|
| Qachon ishlaydi | kompilyatsiyadan oldin | ish vaqtida |
| Tezlik | tez (chaqiruvsiz) | chaqiruv xarajati bor |
| Tur nazorati | yo’q | bor |
| Xatolarni topish | qiyin | oson |
Makroslar tez, ammo xavfli; murakkab mantiq uchun funksiya afzal.
Xulosa
Bu bo’limda oddiy va parametrli makroslarni, qavslarning muhimligini va makros/funksiya farqini ko’rib chiqdik. Makroslar tez, ammo ehtiyotkorlik talab qiladi. Keyingi darsda xotira sinflariga o’tamiz.