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.