Her Yönüyle C
Would you like to react to this message? Create an account in a few clicks or log in to continue.
Her Yönüyle C

Hepsi Burada
 
AnasayfaAnasayfa  PortalliPortalli  GaleriGaleri  AramaArama  Latest imagesLatest images  Kayıt OlKayıt Ol  Giriş yapGiriş yap  

 

 C MAKROLARI (BOLUM 2)

Aşağa gitmek 
YazarMesaj
Admin
Admin
Admin


Erkek
Mesaj Sayısı : 804
Yaş : 35
Location : KoCaElİ
Kayıt tarihi : 29/10/07

Character sheet
Field:
C MAKROLARI (BOLUM 2) Left_bar_bleue100/100C MAKROLARI (BOLUM 2) Empty_bar_bleue  (100/100)

C MAKROLARI (BOLUM 2) Empty
MesajKonu: C MAKROLARI (BOLUM 2)   C MAKROLARI (BOLUM 2) Icon_minitimePtsi Kas. 12, 2007 2:18 am

#define önişlemcisi ile parametrik tanımlamalar veya global fonksiyonlar tanımlamak mümkün olur. Örneğin:
Program 20.5: Makro fonksiyon tanimlama




[color=gray] 1:
/* 20prg05.c: Makro fonksiyon tanimlama. */
2:
3: #include <stdio>
4: #include <math>
5:
6: #define kare(x) (x*x)
7: #define topl(x,y) (x+y)
8: #define carp(x,y) (x*y)
9: #define hipo(x,y) sqrt(x*x+y*y)
10:
11: void main(void)
12: {
13: float a=3.0, b=4.0;
14:
15: printf("kare(2) = %f\n",kare(2));
16: printf("topl(a,b) = %f\n",topl(a,b));
17: printf("carp(a,b) = %f\n",carp(a,b));
18: printf("hipo(a,b) = %f\n",hipo(a,b));
19: }
[color:e76f=gray:e76f]20:
6-9. satırlarında tanımlanan makro fonksiyonlar 15-18. satırlarda kullanılmıştır. 6. satırdaki kare makrosu kendisine parametre olarak aktarılan x değişkeninin karesini hesaplar. Derleyici, 15. satırdaki kare(2) ifadesi (2)*(2) şeklinde yorumlar. Benzer durum diğer makrolar için de geçerlidir. Buna göre programın çıktısı aşağıdaki gibi olacaktır:


DERLEME ve ÇALIŞTIRMA



Turbo C (MS DOS)
GCC (Linux)

C:\TC> tcc 20prg05.c
C:\TC> 20prg05
$ gcc 20prg05.c -o 20prg05
$ ./20prg05

ÇIKTI




kare(2) = 4.000000
topl(a,b) = 7.000000
carp(a,b) = 12.000000
hipo(a,b) = 5.000000
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:
#define BOYUT sizeof(DIZI)/sizof(DIZI[0])
...
int a[10],n;
...
n = BOYUT(a);

işlemiyle c değişkeninine (a dizisinin boyutu) 10 değeri atanır.
İşte ilginç bir makro daha. Daha önce anlatılan degistir(a,b) fonksiyonu pointer kullanmadan aşağıdaki makro ile yazılabilir: #define degistir(a,b) {g=(a); (a)=(b); (b)=g;}
...
int a=4, b=9, g; /* g geçici bir değişken */
...
printf("%d %d\n",a,b); /* 4 9 */
degistir(a,b)
printf("%d %d\n",a,b); /* 9 4 */
...

#undef#define ile tanımlanan bir isim, orjinal tanımlamaları kaldırmaksızın farklı değerler için tekrar tanımlanamaz. Eğer #define ile tanımlanan bir ifade tekrar tanımlanmak istenirse, ya program içinden #define ile tanımlanan ifade kaldırılıp yerine yenisi yazılır ya da #undef önişlemcisi ile önceki tanımlama iptal edildikten sonra #define ile yenisi tanımlanır. Örneğin:
#define x 1299 /* ilk tanımlama */
.
.
.
#undef x /* ilk tanımlamayı iptal et */
#define x 1453 /* yeni tanımlama */

#if, #elif, #else ve #endifBu önişlemciler makro düzeyinde kontrol deyimleridir. Genel kullanım biçimi:
#if (ifade1)
tanımlama blogu1
#elif (ifade2)
tanımlama blogu2
...
#else (ifaden)
tanımlama blogun
#endifşeklindedir. Burada:

  • #if makrosu if deyimine
  • #elif makrosu else if deyimine
  • #else makrosu else deyimine
  • #endif makrosu if deyiminin sonuna
karşılık gelmektedir. Bu makrolar, donanıma veya işletim sistemine uygun olarak değişik makroların tanımlanmasına izin verir. Örneğin:

Program 20.6: Kontrol önişlemcilerinin kullanımı




[color=gray] 1:
/* 20prg06.c: Kontrol önişlemcilerinin kullanımı */
2:
3: #include <stdio>
4:
5: #if (sizeof(int)==2)
6: #define MAKINA "16 bitlik isletim sistemi...\n"
7: #else
8: #define MAKINA "32 bitlik isletim sistemi...\n"
9: #endif
10:
11: main()
12: {
13: printf(MAKINA);
[color:e76f=gray:e76f]14: }


DERLEME ve ÇALIŞTIRMA



Turbo C (MS DOS)
GCC (Linux)

C:\TC> tcc 20prg06.c
C:\TC> 20prg06
$ gcc 20prg06.c -o 20prg06
$ ./20prg06
ÇIKTI



MSDOS (Turbo C)
Linux

16 bitlik isletim sistemi...

32 bitlik isletim sistemi...

#ifdef ve #ifndef#ifdef önişlemcisi, bir ismin tanımlanmış olup olmadığını; #ifndef önişlemcisi bir ismin tanımlanmamış olup olmadığını sorugular[4]. Örneğin:
#ifndef SIFRE
#define SIFRE "ab1234"
#endif

Program 20.7: Tanımlanmış ise DATA portuna 123 yazar




[color=gray] 1:
/* 20prg07.c: Tanımlanmış ise DATA portuna 123 yazar */
2:
3: #include <stdio>
4: #include <dos>
5:
6: #define DATA 0x0378
7:
8: main()
9: {
10: #ifdef DATA
11: outport(DATA,123);
12: printf("Veri DATA portuna yazildi\n");
13: #else
14: printf("DATA portu tanımlanmamis!\n");
15: #endif
[color:e76f=gray:e76f]16: }

DERLEME ve ÇALIŞTIRMA:



MS DOS (Turbo C)
Linux

C:\TC> tcc 20prg07.c
C:\TC> 20prg07

- - - -

ÇIKTI




Veri DATA portuna yazildi
Sayfa başına dön Aşağa gitmek
https://cprogramlama.yetkin-forum.com
 
C MAKROLARI (BOLUM 2)
Sayfa başına dön 
1 sayfadaki 1 sayfası
 Similar topics
-
» C MAKROLARI (BOLUM 3)
» C MAKROLARI

Bu forumun müsaadesi var:Bu forumdaki mesajlara cevap veremezsiniz
Her Yönüyle C :: C Programlama :: C Konu Anlatımları-
Buraya geçin: