Deo zbornika Uvod u programiranje kroz C
Uslovno uključivanje
Pomoću preprocesorskih naredbi #if
, #else
i #elif
možemo uvjetno uključivati ili isključivati pojedine dijelove programa.
Naredba #if
Naredba #if
ima sljedeći oblik:
#if uvjet
blok naredbi
#endif
Ukoliko je uvjet ispunjen blok naredbi izmedu #if
i #endif
bit će uključen u izvorni kod; ako uvjet nije ispunjen blok neće biti uključen.
Uvjet koji se pojavljuje u #if
naredbi je konstantan cjelobrojni izraz. Nula se interpretira kao laž, a svaka vrijednost različita od nule kao istina. Simbolička imena se prije izračunavanja izraza zamijenjuju svojim vrijednostima. Ukoliko se u uvjetu pojavi simboličko ime koje nije prije toga definirano nekom #define
naredbom, ono se zamijenjuje nulom.
Najčešće se uključivanje pomoću naredbe #if
čini u ovisnosti o tome da li je neka varijabla definirana ili nije. Tu nam pomaže izraz defined(ime)
koji daje 1 ako je ime definirano, a 0 ako nije. Na primjer,
#if !defined(__datoteka.h__)
#define __datoteka.h__
/* ovdje dolazi datoteka.h */
#endif
Ako varijabla datoteka.h
nije definirana ona će u sljedećoj #define
naredbi biti definirana i datoteka.h
će biti uključena. U suprotnom će cijela datoteka.h
biti jednostavno preskočena. To je standardna tehnika kojom se izbjegava višestruko uključivanje .h
datoteka u program (provjerite npr. datoteku stdio.h
).
Budući da se konstrukcije #if defined
i #if !defined
često pojavljuju postoje kraći izrazi s istim značenjem: #ifdef
i #ifndef
. Tako smo prethodnu konstrukciju mogli napisati u obliku
#ifndef __datoteka.h__
#define __datoteka.h__
/* ovdje dolazi datoteka.h */
#endif
Zagrade oko varijabli nisu obavezne.
Složene if naredbe grade se pomoću #else
i #elif
, koji ima značenje else if
. Na primjer:
#if SYSTEM == SYSV
#define DATOTEKA "sysv.h"
#elif SYSTEM == BSD
#define DATOTEKA "bsd.h"
#elif SYSTEM == MSDOS
#define DATOTEKA "msdos.h"
#else
#define DATOTEKA "default.h"
#endif
Ovdje se testira ime SYSTEM kako bi se uključila prava datoteka zaglavlja.
Uslovno debagovanje
U razvoju programa korisno je ispisivati što veći broj međurezultata, kako bismo mogli kontrolirati korektnost izvršavanja programa. Nakon što je program završen i testiran sav suvišan ispis treba eliminirati. U tome nam pomaže uvjetno uključivanje koda kao što se vidi na sljedećem primjeru:
int x;
......
scanf("%d",&x);
#ifdef DEBUG
printf("Debug:: x=%d\n", x);
#endif
Ukoliko je varijabla DEBUG
definirana, učitana vrijednost će biti ispisana. Prevodioci pod Unix-om obično imaju -D
opciju, koja se koristi u obliku -Dsimbol
, i koja dozvoljava da se simbol definira na komandnoj liniji. Na primjer, pretpostavimo da je program smješten u datoteku prog.c
. Tada će kompilacija naredbom:
cc -o prog prog.c
proizvesti program u koji ispis varijable x
nije uključen. Kompilacija s naredbom:
cc -DDEBUG -o prog prog.c
dat će izvršni kod koji uključuje printf
naredbu, jer je sada varijabla DEBUG
definirana.
Tehnika koja se koristi u razvoju programa je sljedeća: svi ispisi međurezultata ubacuju se izmedu para #ifdef DEBUG
i #endif
naredbi i program se u razvojnoj fazi kompilira s -DDEBUG
opcijom. Kada je program konačno završen i testiran, kompilira se bez -DDEBUG
opcije. Na taj način se iz izvršnog koda izbacuju sve suvišne printf
(i ostale) naredbe.
Izvor: M. Jurak, Programski jezik C, predavanja 2003/04.