Deo zbornika Uvod u programiranje kroz C
Preprocesorske naredbe u jeziku C
Prije prevodenja izvornog koda u izvršni izvršavaju se preprocesorske naredbe. Svaka linija izvornog koda koja započinje znakom #
predstavlja jednu preporocesorsku naredbu. Njih izvršava zaseban dio prevodioca koji se naziva preprocesor, i koji prije samog procesa prevodenja na osnovu preprocesorskih naredbi mijenja izvorni kôd.
Opći oblik preprocesorskih naredbi je:
#naredba parametri
i one nisu sastavni dio jezika C te ne podliježu sintaksi jezika. Svaka preprocesorska naredba završava krajem linije (a ne znakom točka-zarez). Neke od preprocesorskih naredbi su:
#include #define #undef #if #ifdef #ifndef #elif #else
Naredba #include
Naredba #include može se pojaviti u dva oblika:
#include "ime_datoteke"
ili
#include <ime_datoteke>
U oba slučaja preprocesor će obrisati liniju s #include
naredbom i uključiti sadržaj uključene datoteke u izvorni kôd, na mjestu #include
naredbe. Ako je ime datoteke navedeno unutar navodnika, onda preprocesor datoteku traži u direktoriju u kojem se program nalazi. Ime datoteke navedeno izmedu oštrih zagrada signalizira da se radi o sistemskoj datoteci (npr. stdio.h
), pa će je preprocesor tražiti na mjestu odredenom operacijskim sustavom. Pod Unix-om to je najčešće direktorij /usr/include
a postoji i mogućnost da se prevodiocu da instrukcija (-I
) da te datoteke traži u unaprijed zadanom direktoriju.
Datoteke zaglavlja se najčešće koriste za uključivanje sljedećih veličina:
- Simboličkih konstanti — u
stdio.h
tako imamoEOF
,NULL
itd. - Makro funkcija — na primjer
getchar()
koji je obično definiran kaogetc(stdin)
gdje jegetc()
makro funkcija. - Deklaracije funkcija — u
string.h
je deklariran niz funkcija za rad sa stringovima. - Deklaracije struktura — u
stdio.h
se definira strukturaFILE
. - Definicije tipova — na primjer
size_t
,time_t
, itd.
Datoteka uključena u izvorni kôd pomoću #include
naredbe može i sama sadržavati #include
naredbe.
Naredba #define
Njena je forma sljedeća:
#define ime tekst_zamjene
Preprocesor će od mjesta na kome se #define
naredba nalazi do kraja datoteke svako pojavljivanje imena ime zamijeniti s tekstom tekst zamjene. Do zamjene neće doći unutar struna, tj. unutar dvostrukih navodnika.
Tako će na primjer dio izvornog kôda:
#define PI 3.14
/* neki kod izmedju */
x=2*r*PI;
prije prevodenja biti zamijenjen s
x=2*r*3.14;
no u naredbi printf("PI");
do zamjene ne bi došlo. Svako ime definirano u nekoj #define
naredbi nazivamo makro.
Naredba #define
može se koristiti i bez teksta zamjene kao:
#define ime
Nakon te naredbe ime je definirano, što se može ispitivati pomoću #if
naredbe. Ako je neko ime definirano pomoću #define
, definicija se može poništiti pomoću naredbe #undef
.
Izvor: M. Jurak, Programski jezik C, predavanja 2003/04.