20.2 #define Yönergesi
20.2 #define Yönergesi
Bu önişlemci komutu, kaynak dosyada bir isim yerine başka bir isimin yerleştirilmesini sağlar. Programda kullanılan bu sembolik isimler başta ana program olmak üzere bütün alt programlarda da aynı değere sahiptir. Yani #define önişlemcisi ile tanımlanan her ne olursa olsun, tanımlama bütün fonksiyonlarda kullanılabilir. Bir çeşit genel (global) bildirim gibi davranır. Örneğin:
Program 20.3: #define önişlemcisinin kullanımı
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/* 20prg03.c: #define önişlemcisinin kullanımı */ #include <stdio.h> #define PROGRAM main() #define BASLA { #define BIT } #define YAZ printf PROGRAM BASLA YAZ("Merhaba C!..\n"); BIT |
Program 20.3 derleme işleminden önce #define ile verilen ilk sembolik isimler yerine ikinci isimler yerleştirildikten sonra program aşağıdaki durmuma gelir:
1 2 3 4 5 6 7 8 |
/* 20prg03.c: #define önişlemcisinin kullanımı */ #include <stdio.h> main() { printf("Merhaba C!..\n"); } |
Bu önişlemciyi kullanak sembolik sabitler tanımlamak mümkündür. Örneğin:
1 2 3 |
#define PI 3.1415926 #define IKI_PI 2.0*PI #define YUZ 100 |
gibi.
#define önişlemcisinin kullanımı için iyi bir örnek Program 20.4 de verilmiştir. Program km/s biriminde verilen bir hızı m/s birimine çevirir[4].
Program 20.4: #define önişlemcisinin kullanımı
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/* 20prg04.c: km/s biriminde verilen hızı m/s cinsinden hesaplar */ #include <stdio.h> #define km *1000.0 #define saat *3600.0 main() { double yol,zaman,hiz; yol = 100 km; zaman = 1.2 saat; hiz = yol/zaman; printf("HIZ = %lf m/s\n",hiz); } |
ÇIKTI
1 |
HIZ = 23.148148 m/s |
5. ve 6. satırda tanımlanan sembolik sabitler km ve saat program içinde kullanıldığında sol taraflarındaki sayıyı sırasıyla 1000 ve 3600 ile çarparlar. 12. satırdaki yol değişkenine 100*1000.0 değeri atanır. Benzer olarak 13. satırdaki zaman değişkenine 1.2*3600.0 sayısı atanır. Dikkat edilirse sembolik sabitler kullanıldığında programın okunurluğu artmakta ve bundan dolayı hata ayıklama kolaylaşmaktadır.
#define önişlemcisi ile parametrik tanımlamalar veya global fonksiyonlar tanımlamak mümkün olur. Örneğin:
Program 20.5: Makro fonksiyon tanimlama
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
/* 20prg05.c: Makro fonksiyon tanimlama. */ #include <stdio.h> #include <math.h> /* makro fonksiyonlar */ #define kare(x) (x*x) #define topl(x,y) (x+y) #define carp(x,y) (x*y) #define hipo(x,y) sqrt(x*x+y*y) main(void) { float a=3.0, b=4.0; printf("kare(2) = %f\n",kare(2)); printf("topl(a,b) = %f\n",topl(a,b)); printf("carp(a,b) = %f\n",carp(a,b)); printf("hipo(a,b) = %f\n",hipo(a,b)); } |
ÇIKTI
1 2 3 4 |
kare(2) = 4.000000 topl(a,b) = 7.000000 carp(a,b) = 12.000000 hipo(a,b) = 5.000000 |
Programda tanımlanan kare(2) ifadesi (2)*(2) şeklinde yorumlar. Benzer durum diğer makrolar için de geçerlidir.
Makrolar C’de çok sık kullanılır. Örneğin, tek boyutlu bir dizinin boyutu öğrenilmek istendiğinde aşağıdaki makro kullanılabilir:
1 2 3 4 5 |
#define BOYUT sizeof(DIZI)/sizof(DIZI[0]) ... int a[10], n; ... n = BOYUT(a); |
Son satırdaki işlemle, n değişkeninine (a dizisinin boyutu) 10 değeri atanır.
İşte ilginç bir makro daha. Daha önce anlatılan takas(a,b) fonksiyonu gösterici kullanmadan aşağıdaki makro ile yazılabilir:
1 2 3 4 5 6 7 8 9 10 |
#define takas(x,y) {g=(x); (x)=(y); (y)=g;} ... int x=22, y=33, g; /* g geçici bir değişken */ ... printf("%d %d\n",x,y); /* 22 33 */ takas(a,b) printf("%d %d\n",a,b); /* 33 22 */ ... |