Darsliklar C Makroslar

C C Makroslar

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)#define bilan 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.