CodeBlanks Logo Icon CodeBlanks

Makro fonksiyonlar

  • C kursu
  • Başlangıç
  • Ders 109/116
  • 5 dk

Parametreli makro fonksiyonlar yazmayı öğrenirsin.

Makro fonksiyonlar

Bir #define komutu parametre de alabilir; buna makro fonksiyon denir. Çağrıldığı yere derleme öncesi metin olarak genişletilir.

#define SQUARE(x) ((x) * (x))

int r = SQUARE(5);  /* ((5) * (5)) = 25 */

Her parametre parantez içine alınmalıdır; aksi halde öncelik sorunları çıkar. Örneğin SQUARE(a+b) çağrısı ((a+b) * (a+b)) olarak genişletilir. Makro fonksiyonlar derleme öncesi metin değişimi olduğu için tür denetimi yapmaz; bu yüzden dikkatli kullanmak gerekir.

Parantez kullanımının önemi

Makro fonksiyonlarda her parametre parantez içine alınmalıdır. Aksi halde öncelik hataları oluşur.

#define BAD(x)  x * x
#define GOOD(x) ((x) * (x))

BAD(2+3)   /* 2+3*2+3 = 11 */
GOOD(2+3)  /* ((2+3) * (2+3)) = 25 */

BAD makrosu parametreleri parantezlemediği için 2+3*2+3 olarak genişletilir; bu yanlış sonuç verir. GOOD ise doğru parantezleme sayesinde beklenen 25 sonucunu verir. Bu yüzden makro yazarken her zaman parantez kullanmalısın.

Uygulama SQUARE makrosu ile kare hesapla

#define SQUARE(x) ((x) * (x)) makrosunu tanımla. main içinde printf ile SQUARE(5) değerini %d biçiminde yazdır.

Başlangıç kodu

main.c
#include <stdio.h>

// SQUARE(x) makrosunu tanımla
int main(void) {
    // printf ile SQUARE(5) değerini yazdır
    return 0;
}

Örnek çözüm

main.c
#define SQUARE(x) ((x) * (x))
printf("%d\n", SQUARE(5));

Beklenen çıktı

25

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Makro fonksiyon ile gerçek fonksiyon arasındaki temel fark nedir?

  • Makro derleme öncesi metin değişimidir Doğru cevap
  • Makro daha güvenlidir
  • Makro tür kontrolü yapmaz
  • Makro daha yavaştır

Açıklama: Makro fonksiyon değil, derleme öncesi metin değişimidir.

2 Makro ve davranış eşleştir

Kavram Anlamı
#define PI 3.14 Sabit
#define SQUARE(x) Makro fonksiyon
((x) * (x)) Parantezli gövde
#include Başlık ekler

3 Boşluğu doldur: makro fonksiyon gövdesi

Soru
#define SQUARE(x) ____
Cevap
#define SQUARE(x) ((x) * (x))

Açıklama: ((x) * (x)) her parametreyi parantezler; doğru genişletir.

Başlangıç bölümündeki tüm dersler