Aşağıdaki kodu göz önünde bulundurun:
BAŞLATTAM SAYI n=5;
PRINT("n'nin değeri %d'dir",n);
SON
Yukarıdaki kod geçerli bir C kodu değil.
Ancak aşağıdaki kod geçerlidir:
//Örnek 1.c#define BAŞLAT int ana()
#define SON
#define INTEGER int
#define PRINT(A,B) printf(A,B)
BAŞLAT
TAM SAYI n=5;
PRINT("n'nin değeri %d'dir",n);
SON
Derlemeden önce, START, INTEGER, PRINT ve END makrosu değerleriyle değiştirildi ve kod geçerli bir C kodu oldu. Aşağıdaki komutu kullanarak kontrol edebiliriz:
gcc -E Örnek1.cBu komut, tüm makroları genişlettikten sonra gösterilecektir.
Şimdi farklı makro türleri göreceğiz:
1. Nesne benzeri makrolar:
Sözdizimi:
#define macro_name macro_value- Makro her zaman #define ile başlar
- makro_adı, makronun kullanıcı tanımlı adıdır
- makro_değeri makronun değeridir. Herhangi bir şey olabilir, ancak bir satır ve makro gövdesi o satırın uçlarıyla biter. Sonunda noktalı virgül (;) gerektirmez. Uzay da düşünülür.
Makro birden fazla satır alıyorsa aşağıdaki gibi yapabiliriz:
#define macro_name macro_value1 \makro_değer2 \
makro_değer3
#define MAKS 200
Bu makro bir veri nesnesine benziyor, bu nedenle bu tür bir makro nesne benzeri makro olarak adlandırılır.
//Örnek2.c//#Dahil etmek
#define MAKS 200
int ana()
printf("MAKS Değer: %d",MAKS);
0 döndür;
İçinde Örnek2.c, MAKS bir makro. Çıktıdan anlıyoruz ki MAKS değeri ile değiştirilir 200.
2. İşlev benzeri makrolar:
Sözdizimi:
#define macro_name() macro_valuemakro_adı makronun kullanıcı tanımlı adıdır. parantez çifti sonra koymak zorunda makro_adı. arasında boşluk bırakılamaz makro_adı ve parantez. Bu tür makrolarda argümanları da iletebiliriz.
#define ekle(x,y) x+yBu makro bir işlev çağrısına benziyor, bu nedenle bu tür makrolara işlev benzeri makro denir.
//Örnek3.c#define ekle(x,y) x+y
int ana()
int a;
yüzer b;
a = ekle(4,5);
b = ekle(2.5,3.6)
0 döndür;
Örnek3'te.c, C'nin fonksiyonunun aksine, makronun sadece kodu hesaplamadan argümanlarla değiştirdiğini gördük. Böylece aynı makroyu kullanarak farklı veri tiplerini iletebiliriz.
Makro ismi ile parantez arasına bir boşluk koyarsak, nesne benzeri bir makro ile aynı şekilde çalışır. Aşağıdaki C Örneği bunu göstermektedir.
//Örnek4.c#define ekle (x,y) x+y
int ana()
int a;
yüzer b;
a = ekle(4,5);
b = ekle(2.5,3.6)
Örnek4'te.c, makro eklemenin (x,y) x+y ile değiştirildiğini gördük . Nesne benzeri bir makro ile aynı.
3. Token Yapıştırma için Makro:
C dilinde, belirteç yapıştırma için ## operatörü kullanılır. Bu operatörü kullanarak iki geçerli jetonu tek bir geçerli jetonda birleştirebiliriz.
Misal:
#define MARGE(x,y) x##y
int ana()
int sayı = KENARLIK(52,34);
0 döndür;
Geçerli bir belirteç oluşturmayan belirteç yapıştırmayı denersek, C derleyicisi bir hata veya uyarı verir.
//Örnek6.c#define MARGE(x,y) x##y
int ana()
int sayı = KENARLIK(52,+);
0 döndür;
İçinde Örnek6.c, bir hata mesajımız var çünkü iki jetonun birleşiminden sonra geçersiz bir jeton '52+' alıyoruz.
4. Stringizing için Makro:
C dilinde, bir makro parametresini bir dize sabitine dönüştürmek için # operatörü kullanılır. Bir # operatörü bir makro parametresinden önce geldiğinde, parametre bir dize değişmez değerine dönüşür. Stringizing, nesne benzeri ve işlev benzeri makrolar için kullanılabilir.
Misal:
#define STRINGIZING(x) #x
int ana()
printf(STRINGIZING(Merhaba Dünya) );
0 döndür;
İçinde Örnek7.c STRINGIZING makrosunu kullanan bir "Merhaba Dünya" dizemiz var.
Sonuç:
Bu makale, makro benzeri her tür hakkında bilgi edinmiştir Nesne benzeri makrolar, İşlev benzeri makrolar, Token Yapıştırma için Makro, Stringizing için Makro ve Stringizing için Makro C dilinde. Artık C programımızda hiç şüphesiz bir makro kullanabiliriz.