C Dili – 6. Konu

MAKROLAR

#define BASLA  0  /* döngünün başlangıç noktası */
#define BITIR  9  /* döngünün bitiş noktası     */
#define MAX(A,B)  ((A)>(B)?(A):(B))  /* Max makro tanımlanması */
#define MIN(A,B)  ((A)>(B)?(B):(A))  /* Min makro tanımlanması */
main()
{
 int index,mn,mx;
 int sayac  = 5;
  for (index = BASLA;index <= BITIR;index++) {
    mx = MAX(index,sayac);
    mn = MIN(index,sayac);
    printf("Max simdi %d ve min de %d ..\n",mx,mn);
  }
}
================================================================
 

Bu programda, ilk defa define lara ve makrolarla tanışacaksınız. İlk dört
satırdaki “#define” sözcüklerine dikkat edin. bütün makrolar ve define’lar
bu şekilde baslar. Derleme baslamadan, on-derleyici (preprocessor) bu
tanımları alır, ve programda bu sembolleri gerçek değerleri ile
değiştirir. örneğin, BASLA sembolünü her yerde sıfır ile değiştirir.
Derleyicinin kendisi, bu BASLA yada BITIR sembollerini görmez bile.

Böyle ufak bir programda bu şekilde semboller tanımlamak lüzumsuzdur, fakat
iki binn satirlik bir programda,yirmi yedidi yerde BASLA olsa idi, sayede
#define’değiştirmekek, programdakrakamlarırdeğiştirmektenen daha kolay
olurdu.

Ayni şekilde on-derleyici, BITIS sembolü gördüğü her yere 9 rakamını koyar.

C de alışılmış bir teknik de, BASLA yada BITIR gibi sembolik sabitlerin
buyuk harfle, ve değişken isimlerinin de kucuk harfle yazılmasıdır.

MAKRO NEDIR ?

Makro, bir #define satırından başka birsey değildir. Fakat içinde işlemler
yapabildiği için, ona özel bir isim verilmiştir. örneğin üçüncü satırda,
iki rakamın hangisi büyükse onu döndüren MAX isimli bir makro
tanımlıyoruz. Bundan sonra on-derleyici ne zaman MAX terimini ve arkasından
parantezi görürse, bu parantezlerin arasında iki tane değer bulacağını
farz eder, ve tanımda bulunan deyimi, buraya koyar. örneğin, on ikincii satıraagelindiğindee, “A” yerine “index” ve “B” yerine de “sayac” konur.

Ayni şekilde “MIN” isimli makro da kendisine geçirilen iki rakamın hangisi
daha küçükse, o değeri dondurur.

Bu makrolarda bir suru fazlalık parantez göreceksiniz. Bunların nedeni, bir
sonraki programda anlaşılacak..

YANLIS BIR MAKRO

================================================================

#define HATALI(A) A*A*A /* Kup icin hatali makro */
#define KUP(A) (A)*(A)*(A) /* Dogusu ... */
#define KARE(A) (A)*(A) /* Karesi icin dogru makro */
#define START 1
#define STOP 9 main()
{
int i,offset; offset = 5; for (i = START;i <= STOP;i++) {
printf("%3d in karesi %4d dir, ve kubu ise %6d dir..\n",
i+offset,KARE(i+offset),KUP(i+offset)); printf("%3d in HATALIsi ise %6d dir.\n",i+offset,HATALI(i+offset));
}
} ================================================================

İlk satıra baktığınıza, HATALI isimli makronun bir rakamın küpünü aldığını görüyoruz. Gercektende, bu makro bazen doğru çalışmaktadır.
Programın kendisinde,i+offset ‘in KUP unun hesaplandığı yeri inceleyelim. Şayet i 1 ise, offset de 5 olduğuna göre, 1+5 = 6 olacaktır. KUP isimli makroyu kullanırken, değerler:

(1+5)*(1+5)*(1+5) = 6*6*6 = 216

olacaktır. Halbuki, HATALI yi kullanırsak, çarpmanın önceliği, toplamadan
fazla olduğundan, değerleri:

1+5*1+5*1+5 = 1+5+5+5 = 16

seklinde buluyoruz. Yani, parantezler, değişkenleri doğru bir şekilde
birbirinden ayırmak için gereklidir.

Programın gerisi basittir, ve sizin incelemenize bırakılmıştır..

ODEV:

1. 7 den -5 e doğru sayan bir program yazınız. Program 7 ve -5 için birer DEFINE tanımlasın.

Bir Sonraki Konu