Tänk på följande kod:
STARTINTEGER n = 5;
PRINT ("Värdet på n är% d", n);
SLUTET
Ovanstående kod är inte en giltig C-kod.
Men följande kod är giltig:
// Exempel1.c#define START int main ()
#define END
#define INTEGER int
#define PRINT (A, B) printf (A, B)
START
INTEGER n = 5;
PRINT ("Värdet på n är% d", n);
SLUTET
Innan kompilering har makrot START, INTEGER, PRINT och END ersatts med sitt värde och koden blir en giltig C-kod. Vi kan kontrollera med följande kommando:
gcc -E Exempel 1.cDetta kommando visas efter att alla makron har expanderats.
Nu kommer vi att se olika typer av makron:
1. Objektliknande makron:
Syntax:
#define macro_name macro_value- Makro börjar alltid med #define
- macro_name är ett användardefinierat namn på makrot
- macro_value är värdet på makrot. Det kan vara vad som helst, men en rad och makrokroppen slutar med den radens ändar. Det kräver inte semikolon (;) i slutet. Utrymme beaktas också.
Om makrot tar mer än en rad kan vi göra det enligt följande:
#define macro_name macro_value1 \makrovärde2 \
macro_value3
#define MAX 200
Detta makro ser ut som ett dataobjekt, det är därför den här typen av makro kallas som ett objektliknande makro.
// Exempel2.c//#omfatta
#define MAX 200
int main ()
printf ("MAX-värde är:% d", MAX);
returnera 0;
I Exapmle2.c, MAX är ett makro. Från produktionen observerar vi det MAX ersätts med dess värde 200.
2. Funktionsliknande makron:
Syntax:
#define macro_name () macro_valuemakronamn är ett användardefinierat namn på makrot. Par parentes måste sätta efter makronamn. Inget utrymme är tillåtet mellan makronamn och parentes. Vi kan också skicka argument i denna typ av makron.
#define add (x, y) x + yDetta makro ser ut som ett funktionsanrop, det är därför den här typen av makro kallas ett funktionsliknande makro.
// Exempel3.c#define add (x, y) x + y
int main ()
int a;
flyta b;
a = addera (4,5);
b = lägg till (2.5,3.6)
returnera 0;
I exempel 3.c, Vi har sett att till skillnad från C: s funktion, ersätter makrot endast koden med argument utan att beräkna den. Så vi kan skicka olika datatyper med samma makro.
Om vi placerar ett mellanslag mellan makronamnet och parentesen fungerar det på samma sätt som ett objektliknande makro. Nedan illustrerar C exempel detta.
// Exempel4.c#define add (x, y) x + y
int main ()
int a;
flyta b;
a = addera (4,5);
b = lägg till (2.5,3.6)
I exempel 4.c, vi har sett att makrotillägget ersätts med (x, y) x + y . Samma som ett objektliknande makro.
3. Makro för polering av token:
På C-språk används ## operator för att klistra in token. Med den här operatören kan vi kombinera två giltiga tokens till en giltig token.
Exempel:
#define MARGE (x, y) x ## y
int main ()
int num = MARGE (52,34);
returnera 0;
Om vi försöker att klistra in token som inte genererar en giltig token, ger C-kompilatorn ett fel eller en varning.
// Exempel 6.c#define MARGE (x, y) x ## y
int main ()
int num = MARGE (52, +);
returnera 0;
I Exempel 6.c, vi har ett felmeddelande eftersom vi efter en kombination av två tokens får en ogiltig token '52 + '.
4. Makro för strängläggning:
På C-språk används # operator för att konvertera en makroparameter till en strängkonstant. När en # -operator föregår en makroparameter, omvandlas parametern till en strängbokstav. Stringizing kan användas för objektliknande och funktionsliknande makron.
Exempel:
#define STRINGIZING (x) #x
int main ()
printf (STRINGIZING (Hello World));
returnera 0;
I Exempel 7.c Vi har en sträng "Hello World" med STRINGIZING-makro.
Slutsats:
Denna artikel har lärt sig om alla typer av makroliknande Objektliknande makron, Funktionsliknande makron, Makro för polering av token, Makro för Stringizing och Makro för Stringizing på C-språk. Nu kan vi använda ett makro i vårt C-program utan tvekan.