Vurder følgende kode:
STARTINTEGER n = 5;
PRINT ("Verdien av n er% d", n);
SLUTT
Ovennevnte kode er ikke en gyldig C-kode.
Men følgende kode er gyldig:
// Eksempel1.c#define START int main ()
#define END
#define INTEGER int
#define PRINT (A, B) printf (A, B)
START
INTEGER n = 5;
PRINT ("Verdien av n er% d", n);
SLUTT
Før kompilering er makroen START, INTEGER, PRINT og END erstattet av verdien, og koden blir en gyldig C-kode. Vi kan sjekke med følgende kommando:
gcc -E Eksempel1.cDenne kommandoen vises etter utvidelse av alle makroene.
Nå vil vi se forskjellige typer makroer:
1. Objektlignende makroer:
Syntaks:
#define macro_name macro_value- Makro begynner alltid med #define
- macro_name er et brukerdefinert navn på makroen
- macro_value er verdien av makroen. Det kan være hva som helst, men en linje og makrodelen slutter med den linjens ender. Det krever ikke semikolon (;) på slutten. Rom vurderes også.
Hvis makroen tar mer enn en linje, kan vi gjøre det som følger:
#define macro_name macro_value1 \makroverdi2 \
makroverdi3
#definer MAX 200
Denne makroen ser ut som et dataobjekt, og derfor kalles denne makrotypen som en objektlignende makro.
// Eksempel2.c//#inkludere
#definer MAX 200
int main ()
printf ("MAX Value is:% d", MAX);
retur 0;
I Exapmle2.c, MAX er en makro. Fra produksjonen observerer vi det MAX erstattes av verdien 200.
2. Funksjonslignende makroer:
Syntaks:
#define macro_name () macro_valuemakronavn er et brukerdefinert navn på makroen. Par parentes må settes etter makronavn. Det er ikke tillatt med mellomrom makronavn og parentes. Vi kan også sende argumenter i denne typen makroer.
#definer add (x, y) x + yDenne makroen ser ut som et funksjonsanrop, det er grunnen til at denne typen makro kalles en funksjonslignende makro.
// Eksempel3.c#definer add (x, y) x + y
int main ()
int a;
flyte b;
a = legg til (4,5);
b = legg til (2.5,3.6)
retur 0;
I eksempel 3.c, vi har sett at i motsetning til Cs funksjon erstatter makroen bare koden med argumenter uten å beregne den. Så vi kan sende forskjellige datatyper ved hjelp av samme makro.
Hvis vi setter et mellomrom mellom makronavnet og parentesen, fungerer det det samme som en objektlignende makro. Nedenfor illustrerer C eksempel dette.
// Eksempel4.c#definer add (x, y) x + y
int main ()
int a;
flyte b;
a = legg til (4,5);
b = legg til (2.5,3.6)
I eksempel 4.c, vi har sett at makrotilsetningen er erstattet av (x, y) x + y . Samme som en objektlignende makro.
3. Makro for liming av token:
I C-språk brukes ## operator for tokenliming. Ved hjelp av denne operatøren kan vi kombinere to gyldige tokens i ett gyldig token.
Eksempel:
#definer MARGE (x, y) x ## y
int main ()
int num = MARGE (52,34);
retur 0;
Hvis vi prøver å tokenliming som ikke genererer et gyldig token, gir C-kompilatoren en feil eller advarsel.
// Eksempel 6.c#definer MARGE (x, y) x ## y
int main ()
int num = MARGE (52, +);
retur 0;
I Eksempel 6.c, vi har en feilmelding fordi vi etter en kombinasjon av to tokens får et ugyldig token '52 + '.
4. Makro for strenging:
På C-språk brukes # operator til å konvertere en makroparameter til en strengkonstant. Når en # -operator går foran en makroparameter, konverteres parameteren til en streng bokstavelig. Stringizing kan brukes til objektlignende og funksjonslignende makroer.
Eksempel:
#define STRINGIZING (x) #x
int main ()
printf (STRINGIZING (Hello World));
retur 0;
I Eksempel 7.c vi har en streng “Hello World” ved hjelp av STRINGIZING-makroen.
Konklusjon:
Denne artikkelen har lært om alle typer makrolignende Objektlignende makroer, Funksjonslignende makroer, Makro for polering av token, Makro for Stringizing og Makro for Stringizing på C-språk. Nå kan vi uten tvil bruke en makro i C-programmet vårt.