Makrolar

04:52


Makrolar derleyicilerden bağımsız ve derleyicilerden önce kod üzerinde değişiklik yapan preprecessor için yazılan kodlardır. preprecessor'ün kendi özel syntax'ı vardır. # ile başlayan ifadeler preprecessor için komut dizinleridir.

MAKROLARIN SINIFLANDIRILMASI


1. Object-like Macros'lar nesne gibi kullanılabilen makrolar oluşturulabilir.
#define BOOL int tanımlamasını yaptıktan sonra BOOL ifadesi int gibi kullanılabilir.

2. Function-like Macros'lar ise makroların fonksiyon gibi kullanılabildiği bildirimlerdir.

#define kare(a)  ((a)*(a))

3. Macro Arguments

#define min(X, Y)  ((X) < (Y) ? (X) : (Y))

4. Stringification kavramı daha çok yer değiştirme işlemi sırasında parametre olarak string ifadesi alıp bunu ikinci kısımda nasıl yerleştireceğine ilişkindir.

#define PRINT(EXP) puts("-->" #EXP)  ifadesinde görüleceği üzere birinci kısımda fınksiyon içindeki ifadeyi ikinci kısımda string olarak birleştirip ekrana basmıştır.



5. Concatenation kavramı makrolarla parametrelertek #'li ifadede gelen string(!) şeklinde olmaktadır. iki ##'li ifadede ise gelen parametre aynen gelmektedir.

#define func(a) a##f("Hello World\n"); func(print) dediğimizde printf("Hello World\n"); biçimine gelecektir.





6. Predefined Macros'lar ise default olarak tanımlı gelen makrolardır.Çok kulanılanlar aşağıdaki gibidir:

__FILE__ :dosya ismini string gibi yer değiştirir.
__LINE__ :yazılı olan yerin satır numarasıyla yer değiştirir.
__DATE__ :preprecessorün devreye girdiği andaki zamanla yer değiştirir.
__TIME__ :preprecessorün devreye girdiği andaki tarihle yer değiştirir.




__cplusplus  :C++ derleyici ise define edilmiş olarak gelir.



#define

define makrosu kendisinden sonra gelen deyimi bir sonraki deyim ile değiştiren bir makro ifadesidir.



#undef

bu satırdan itibaren ilgili define ifadesi geçersiz olacaktır.



#ifndef

ifndef ifadesinden sonraki deyim define edilmemiş ise koşul içine girilir. Tanımlanmışsa koşul ifadesi içine girmez.



#else

koşul ifadesini sağlamıyorsa buraya girer.



#endif


şartlı makro ifadelerinin sonlanmasını sağlayan syntaz kural ifadesidir.




#ifdef


ifdef ifadesinden sonraki deyim define edilmiş ise koşul içine girilir. Tanımlanmamışsa koşul ifadesi içine girmez.