Admin Admin
![Admin](https://2img.net/u/3313/75/80/72/avatars/1-57.gif)
![Erkek Erkek](https://2img.net/i/fa/subsilver/icon_gender_male.gif) Mesaj Sayısı : 804 Yaş : 35 Location : KoCaElİ Kayıt tarihi : 29/10/07
Character sheet Field:
![C MAKROLARI Left_bar_bleue](https://2img.net/i/fa/i/left_bar_bleue.jpg) ![100/100](https://2img.net/i/fa/i/full_bar_bleue.jpg) ![C MAKROLARI Empty_bar_bleue](https://2img.net/i/fa/i/empty_bar_bleue.jpg) (100/100)
![C MAKROLARI Empty](https://2img.net/i/empty.gif) | Konu: C MAKROLARI Ptsi Kas. 12, 2007 2:17 am | |
| GirişMakro bildirimleri veya önişlemcileri (direktifleri) derleme öncesi komutlarıdır. Bunlar tipik olarak:
- programları değiştirmek
- program parçalarını kaynak programında birleştirmek
- derleme sırasında bazı uyarı mesajlarını aktif veya pasif hale getirmek
için kullanılır. Genelde makro bildirimleri kaynak dosyaların en başında verilir. C dilinde kullanılan önişlemciler şöyledir: #include #define #pragma #error #undef #ifdef #ifndef #if #else #elif #endif#includeBu önişlemci verilen dosyanın içeriğini, kullanıldığı yerde kaynak dosyasının içine ekler. Çoğunlukla derleyiciye ait komut kütüphanelerinde bulunan fonksiyonların prototiplerinin ve diğer çeşitli tanımlamaların bulunlunduğu (h uzantılı) başlık dosyalarının programa dahil edilmesinde kullanılır [2]. İki tür kullanımı vardır: #include veya #include "dosya_adı.h"
- Birinci kullanımda dosyanın nerede bulunduğu derleyici için verilen ulaşım yolu ile belirlenir. Bu yol genellikle include dizini ile son bulur. Başlık dosyalarının saklandığı include dizini
- Borland firmasına ait Turbo C derleyicisinde : C:\TC\INCLUDE
- Linux ortamında : /usr/include şeklindedir.
İkinci kullanımlada dosyanın bulunduğu yer aktif dizin olarak kabul edilir. Aksi halde yol tam olarak verilmelidir. #include deyimi ile program ilave edilecek dosya C fonksiyonları içerebileceği gibi basit deyimler de içerebilir. Bunun için bir sınırlandırma yoktur. Hatta uzantıları .h olması bile gerekmez. Program 20.1 ve Program 20.2'yi inceleyin.
Program 20.1: #include önişlemcisinin kullanımı için bir örnek
[color=gray] 1: /* 20prg01.c: DATA-port uçlarına sırasıyla 1 değerini gönderir */ 2: 3: #include <stdio> 4: #include <dos> 5: #include <conio> 6: #include <math> 7: #include "port.h" 8: 9: main() 10: { 11: int veri,sayac; 12: 13: sayac = 0; /* döngü sayacı */ 14: veri = 1; 15: 16: do 17: { 18: outportb(DATA,veri); /* DATA portuna int veri yaz */ 19: printf("\nPorta yazilan veri : %3d %08ld",veri,cevir_taban2(veri)); 20: veri <<= 1; /* veriyi binary olarak birer-birer sola kaydır! */ 21: delay(500); /* bekle... */ 22: sayac++; 23: }while( sayac<8> tcc 20prg01.c C:\TC> 20prg01
- - - -
Çıktı: ÇIKTI
Porta yazilan veri : 1 00000001 Porta yazilan veri : 2 00000010 Porta yazilan veri : 4 00000100 Porta yazilan veri : 8 00001000 Porta yazilan veri : 16 00010000 Porta yazilan veri : 32 00100000 Porta yazilan veri : 64 01000000 Porta yazilan veri : 128 10000000
Program 20.2: #include önişlemcisinin kullanımı için bir örnek
[color=gray] 1: /* 20prg02.c: DATA-port uçlarına sırasıyla 1 değerini gönderir */ 2: 3: #include <stdio> 4: #include <dos> 5: #include <conio> 6: #include <math> 7: #include "port.h" 8: 9: main() 10: { 11: #include "bildirim.inc" 12: 13: do 14: { 15: outportb(DATA,veri); /* DATA portuna int veri yaz */ 16: printf("\nPorta yazilan veri : %3d %08ld",veri,cevir_taban2(veri)); 17: veri <<= 1; /* veriyi binary olarak birer-birer sola kaydır! */ 18: delay(500); /* bekle... */ 19: sayac++; 20: }while( sayac<8> tcc 20prg02.c C:\TC> 20prg02
- - - -
Çıktı: ÇIKTI
Porta yazilan veri : 1 00000001 Porta yazilan veri : 2 00000010 Porta yazilan veri : 4 00000100 Porta yazilan veri : 8 00001000 Porta yazilan veri : 16 00010000 Porta yazilan veri : 32 00100000 Porta yazilan veri : 64 01000000 Porta yazilan veri : 128 10000000
#defineBu önişlemci komutu, kaynak dosyada bir isim yerine başka bir isim 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ı
[color=gray] 1: /* 20prg03.c: #define önişlemcisinin kullanımı */ 2: 3: #include <stdio> 4: 5: #define PROGRAM main() 6: #define BASLA { 7: #define BIT } 8: #define YAZ printf 9: 10: PROGRAM 11: BASLA 12: YAZ("Merhaba C!..\n"); [color:4bb4=gray:4bb4]13: 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: /* 20prg03.c: #define önişlemcisinin kullanımı */
#include <stdio>
main() { printf("Merhaba C!..\n"); } Bu önişlemciyi kullanak sembolik sabitler tanımlamak mümkündür. Örneğin: #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ı
[color=gray] 1: /* 20prg04.c: km/s biriminde verilen hızı m/s cinsinden hesaplar */ 2: 3: #include <stdio> 4: 5: #define km *1000.0 6: #define saat *3600.0 7: 8: main() 9: { 10: double yol,zaman,hiz; 11: 12: yol = 100 km; 13: zaman = 1.2 saat; 14: 15: hiz = yol/zaman; 16: 17: printf("HIZ = %lf m/s\n",hiz); 18: [color:4bb4=gray:4bb4]19: } 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.
DERLEME ve ÇALIŞTIRMA
Turbo C (MS DOS) GCC (Linux)
C:\TC> tcc 20prg04.c C:\TC> 20prg04 $ gcc 20prg04.c -o 20prg04 $ ./20prg04
ÇIKTI
HIZ = 23.148148 m/s
| |
|