Makroi i uslovno prevođenje (C)
#fax #cs/prog/c [deo jezika C]
Jednostavne operacije nad tekstualnim sadržajem programa, koje se vrše u fazi pretprocesiranja.
Uključivanje datoteka zaglavlja — #include
uključivanje u program prototipa funkcija:
#include "ime_datoteke.h" //iz direktorijuma programa
#include <ime_datoteke.h> //iz direktorijuma standardnih biblioteka
Makro zamene — #define
Zamena:
#define ORIGINALNI_TEXT novi_tekst
// zamena niza karaktera drugim nizom
Kraj primene zamene:
#undef ORIGINALNI_TEXT
Primer
#define MAX 100
...
//tekst programa -> posle prevođenja
a = MAX -> a = 100
int niz[MAX] -> int niz[100]
printf("MAX"); // neće biti zamenjeno
b = MAX_LEN; // neće biti zamenjeno
Zamene sa argumentima:
#define max(A, B) ((A) > (B) ? (A) : (B))
...
max(2, 3) -> ((2) > (3) ? (2) : (3))
max(x+2, 4*y) -> ((x+2) > (4*y) ? (x+2) : (4*y))
max(x++, ++y) -> ((x++) > (--y) ? (x++) : ++y))
// nije funkcija inkrementiraće dva puta!
treba paziti na zagrade:
#define kvadrat(x) x*x
...
kvadrat(a + 2) -> a + 2*a + 2 // !
#define kvadrat(x) (x)*(x)
...
kvadrat(a + 2) -> (a + 2)*(a + 2)
10/kvadrat(a) -> 10/(a)*(a) // !
#define kvadrat(x) ((x)*(x))
...
10/kvadrat(a) -> 10/((a)*(a))
zamena vrednosti promenljivih:
#define swap(t, x, y) { t z; z = x; x = y; y = z; }
...
swap(int, a, b) -> { int z; z = a; a = b; b = z; }
zamena sa " "
— identifikator #
:
#define dprint(EXP) printf(#EXP " = %d", EXP)
...
dprint(x/y) -> printf("x/y" " = %d", x/y)
zamena unutra imena promenljive — identifikator ##
:
#define dodaj_u_niz(ime, element) \
niz_##ime[brojac_##ime++] = element
...
dodaj_u_niz(a, 2) -> niz_a[brojac_a++] = 2
Uslovno prevođenje
#ifdef // ako je definisano
#ifndef // ako nije definisano
#else // inače
#endif // kraj uslova
Primer:
#include <stdio.h>
#define SRB
int main() {
#ifdef SRB
printf("Zdravo\n");
#else
printf("Hello\n");
#endif
return 0;
}
Definisanje preko komandne linije:
gcc -D SRB 1.c