Min aller første C-makro


søndag 3. juli 2011 C Macro

Det er både mest produktivt og mest spennende å programmere i såkalte høynivå-språk. For å kunne kalle seg en komplett programmerer mener jeg derimot det også er nødvendig å beherske et språk som er “tettere på metallet”. Jeg tenker da i praksis at man bør lære seg enten assembler eller C – eller gjerne begge deler.

Og nå har også jeg (endelig) begynt å lære meg C. Jeg leser nemlig Kernighan & Ritchies gamle klassiker (sjekk ut sommerlektyre). Jeg har ikke gjort så mye praktisk koding enda, men da jeg kom til kapittelet om preprosessering og macro substitution måtte jeg eksperimentere litt.

Så uten noe mere snikksnakk, her er min aller første makro i C (min løsning på øvelse 4-14 i boken).

10 #include <stdio.h>
11 
12 #define swap(t,x,y) { \
13   t temp = x; \
14   x = y; \
15   y = temp; \
16 }
17 
18 int main()
19 {
20   int a, b, temp; // declare a temp variable to mess things up
21                   // if I don't implement the macro properly
22   a = 1; b = 2;
23 
24   printf("a = %d, b = %d\n", a, b); // => a = 1, b = 2
25   swap(int, a, b);
26   printf("a = %d, b = %d\n", a, b); // => a = 2, b = 1
27 
28   return 0;
29 }

For dem som ikke kjenner C’s preprosessor så definerer jeg her en macro jeg kaller swap som tar tre argumenter. Før programmet kompileres vil preprosessoren bytte ut alle forekomster av token swap i koden med definisjonen av makroen. Linje 25 i koden over vil altså bli erstattet med koden nedenfor.

25   {
26     int temp = a;
27     a = b;
28     b = temp;
29   }

Hadde jeg ikke inkludert koden i en blokk ({..}) ville jeg fått problemer med temp-variabelen. Men fordi jeg bruker en blokk har jeg fått laget et nytt scope, hvor jeg får laget en ny variabel jeg kan kaller temp, selv om det eksisterer en temp fra før.

gru-gleder jeg meg til å begynne på kapittelet om pointere…


comments powered by Disqus