Overvej følgende kode:
STARTINTEGER n = 5;
PRINT ("Værdien af n er% d", n);
ENDE
Ovenstående kode er ikke en gyldig C-kode.
Men følgende kode er gyldig:
// Eksempel1.c#define START int main ()
#define END
#define INTEGER int
#definer PRINT (A, B) printf (A, B)
START
INTEGER n = 5;
PRINT ("Værdien af n er% d", n);
ENDE
Før kompilering er makroen START, INTEGER, PRINT og END blevet erstattet af deres værdi, og koden bliver en gyldig C-kode. Vi kan kontrollere ved hjælp af følgende kommando:
gcc -E Eksempel1.cDenne kommando vises efter udvidelse af alle makroer.
Nu ser vi forskellige typer makroer:
1. Objektlignende makroer:
Syntaks:
#definer makronavn makroværdi- Makro starter altid med #define
- makronavn er et brugerdefineret navn på makroen
- macro_value er værdien af makroen. Det kan være hvad som helst, men en linje og makroelementet slutter med linjens ender. Det kræver ikke semikolon (;) i slutningen. Rummet overvejes også.
Hvis makroen tager mere end en linje, kan vi gøre det som følger:
#definer makronavn makroværdi1 \makroværdi2 \
makroværdi3
#definer MAX 200
Denne makro ligner et dataobjekt, hvorfor denne type makro kaldes som en objektlignende makro.
// Eksempel2.c//#omfatte
#definer MAX 200
int main ()
printf ("MAX-værdi er:% d", MAX);
returnere 0;
I Exapmle2.c, MAX er en makro. Fra output observerer vi det MAX erstattes af dens værdi 200.
2. Funktionslignende makroer:
Syntaks:
#definer makronavn () makroværdimakronavn er et brugerdefineret navn på makroen. Et par parenteser skal sættes efter makronavn. Der er ikke plads til mellemrum makronavn og parentes. Vi kan også sende argumenter i denne type makroer.
#definer tilføj (x, y) x + yDenne makro ligner et funktionsopkald, hvorfor denne type makro kaldes en funktionslignende makro.
// Eksempel3.c#definer tilføj (x, y) x + y
int main ()
int a;
flyde b;
a = tilføj (4,5);
b = tilføj (2.5,3.6)
returnere 0;
I eksempel 3.c, Vi har set, at i modsætning til C's funktion erstatter makroen kun koden med argumenter uden at beregne den. Så vi kan videregive forskellige datatyper ved hjælp af den samme makro.
Hvis vi sætter et mellemrum mellem makronavnet og parentesen, fungerer det det samme som en objektlignende makro. Nedenfor illustrerer C-eksemplet dette.
// Eksempel 4.c#definer tilføj (x, y) x + y
int main ()
int a;
flyde b;
a = tilføj (4,5);
b = tilføj (2.5,3.6)
I eksempel 4.c, vi har set, at makrotilføjelsen erstattes af (x, y) x + y . Samme som en objektlignende makro.
3. Makro til polering af tegn:
På C-sprog bruges ## operator til at indsætte token. Ved hjælp af denne operator kan vi kombinere to gyldige tokens til et gyldigt token.
Eksempel:
#definer MARGE (x, y) x ## y
int main ()
int num = MARGE (52,34);
returnere 0;
Hvis vi prøver at indsætte token, der ikke genererer et gyldigt token, giver C-compileren en fejl eller advarsel.
// Eksempel 6.c#definer MARGE (x, y) x ## y
int main ()
int num = MARGE (52, +);
returnere 0;
I Eksempel 6.c, vi har en fejlmeddelelse, fordi vi efter en kombination af to tokens får et ugyldigt token '52 + '.
4. Makro til strengning:
På C-sprog bruges # operator til at konvertere en makroparameter til en strengkonstant. Når en # -operator går foran en makroparameter, konverteres parameteren til en streng-bogstav. Stringizing kan bruges til objektlignende og funktionslignende makroer.
Eksempel:
#definer STRINGIZING (x) #x
int main ()
printf (STRINGIZING (Hello World));
returnere 0;
I Eksempel 7.c vi har en streng “Hello World” ved hjælp af STRINGIZING-makroen.
Konklusion:
Denne artikel har lært om alle typer makro-lignende Objektlignende makroer, Funktionslignende makroer, Makro til polering af poletter, Makro til Stringizing og Makro til Stringizing på C-sprog. Nu kan vi uden tvivl bruge en makro i vores C-program.