Programski jezik C

Makro stavki

Čeprav bolj primernega slovenskega prevoda za besedo makro ne poznam, si z uporabo t.i. makro ukazov prihranimo pisanje oziroma dosežemo enak učinek z manj pisanja. Vsi makri so namenjeni prevajalniku, zato se začnejo z znakom # in se ponavadi ne končajo s podpičjem.

Makro #define

Najpogostejši makro je makro #define, s katerim nastavimo konstante, ki jih lahko uporabimo v programski kodi ali nam služijo kot pogoj za pogojne stavke namenjene prevajalniku.

#define PI 3.14

Z zgornjim ukazom smo nastavili konstanto in posredno prevajalniku povedali, naj v datoteki, kjer smo podali ukaz, zamenja vse pojavitve PI z vrednostjo 3.14. Zaradi enakega razloga bo naslednji seznam buffer dolžine 10.

#define MAX_LENGTH 10
char buffer[MAX_LENGTH]

Enostavne funkcije

Ker prevajalnik zamenja vse pojavitve, je makro primeren tudi za enostavne funkcije, kot je prikazano v nadaljevanju.

#define ADD_ONE(x) ((x) + 1)

printf("Vrednost je %i.\n", ADD_ONE(2));	/* Izpiše: Vrednost je 3. */

Prevajalnik bo pred prevajanjem zadnji zgornji stavek prepisal v printf("Vrednost je %i.\n", ((2) + 1)); in vrednost pri prevajanju tudi izračunal.

Pomembnost oklepajev

Pri pisanju funkcijih ne smemo varčevati z oklepaji, čeprav se nam zdijo odvečni. Za primer napišimo funkcijo min, ki primerja dve vrednosti in izpiše manjšo. To funkcijo uporabimo pri določanju začetne vrednosti spremenljivke v.

#define min(a,b) a < b ? a : b
int v = -min(2, 3); /* Ali je v = -2 ? */

Da bi ugotovili, kakšne vrednosti bo spremenljivka v, lahko ročno zamenjamo funkcijo min.

int v = -2 < 3 ? 2 : 3; /* Ne, v = 2 ! */

Da se takšne napake ne bi pojavljale, moramo vsako spremenljivko in tudi celoto zaviti v oklepaje.

#define min(a,b) ( (a) < (b) ? (a) : (b) )

[v nastajanju]