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.
#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.