Harkitse seuraavaa koodia:
ALKAAINTEGER n = 5;
PRINT ("n: n arvo on% d", n);
LOPPU
Yllä oleva koodi ei ole kelvollinen C-koodi.
Mutta seuraava koodi on kelvollinen:
// Esimerkki 1.c#define START int main ()
#define END
#define INTEGER int
#define TULOSTA (A, B) printf (A, B)
ALKAA
INTEGER n = 5;
PRINT ("n: n arvo on% d", n);
LOPPU
Ennen kääntämistä makro START, INTEGER, PRINT ja END on korvattu niiden arvolla, ja koodista tulee kelvollinen C-koodi. Voimme tarkistaa seuraavan komennon avulla:
gcc -E Esimerkki 1.cTämä komento näkyy, kun kaikki makrot on laajennettu.
Nyt näemme erityyppisiä makroja:
1. Objektin kaltaiset makrot:
Syntaksi:
#define macro_name makroarvo- Makro alkaa aina #define -merkillä
- macro_name on käyttäjän määrittelemä makron nimi
- macro_value on makron arvo. Se voi olla mitä tahansa, mutta yksi rivi ja makrokappale päättyvät kyseisen rivin päihin. Se ei vaadi puolipistettä (;) lopussa. Avaruus otetaan myös huomioon.
Jos makro vie useamman kuin yhden rivin, voimme tehdä sen seuraavasti:
#define macro_name makroarvo1 \makroarvo2 \
makroarvo3
#define MAX 200
Tämä makro näyttää dataobjektilta, minkä vuoksi tämän tyyppistä makroa kutsutaan objektimäiseksi makroksi.
// Esimerkki 2.c//#sisältää
#define MAX 200
int main ()
printf ("MAX-arvo on:% d", MAX);
paluu 0;
Sisään Exapmle2.c, MAX on makro. Lähdön perusteella havaitsemme sen MAX korvataan sen arvolla 200.
2. Toimintomaiset makrot:
Syntaksi:
#define macro_name () makro_arvomakron_nimi on käyttäjän määrittelemä makron nimi. Pari sulkeita on lisättävä makron_nimi. Välissä ei ole tilaa makron_nimi ja sulkeet. Voimme välittää argumentteja myös tämän tyyppisissä makroissa.
#define add (x, y) x + yTämä makro näyttää funktiokutsulta, minkä vuoksi tämän tyyppistä makroa kutsutaan funktion kaltaiseksi makroksi.
// Esimerkki 3.c#define add (x, y) x + y
int main ()
int a;
kellua b;
a = lisää (4,5);
b = lisää (2.5,3.6)
paluu 0;
Esimerkissä 3.c, Olemme nähneet, että toisin kuin C: n funktio, makro korvaa vain koodin argumenteilla laskematta sitä. Joten voimme välittää eri tietotyypin samalla makrolla.
Jos laitamme välilyönnin makron nimen ja sulkeiden väliin, se toimii samalla tavalla kuin objektimäinen makro. Alla oleva esimerkki C kuvaa tätä.
// Esimerkki 4.c#define add (x, y) x + y
int main ()
int a;
kellua b;
a = lisää (4,5);
b = lisää (2.5,3.6)
Esimerkissä 4.c, olemme havainneet, että makron lisäys korvataan (x, y) x + y . Sama kuin objektimainen makro.
3. Makro tunnuksen liittämistä varten:
C-kielellä ## -operaattoria käytetään tunnuksen liittämiseen. Tämän operaattorin avulla voimme yhdistää kaksi kelvollista tunnusta yhdeksi kelvolliseksi tunnukseksi.
Esimerkki:
#define MARGE (x, y) x ## y
int main ()
int numero = MARGE (52,34);
paluu 0;
Jos yritämme tunnuksen liittämistä, joka ei luo kelvollista tunnusta, C-kääntäjä antaa virheen tai varoituksen.
// Esimerkki 6.c#define MARGE (x, y) x ## y
int main ()
int numero = MARGE (52, +);
paluu 0;
Sisään Esimerkki 6.c, meillä on virheilmoitus, koska kahden tunnuksen yhdistelmän jälkeen saamme virheellisen tunnuksen '52 + '.
4. Makro merkkijonoa varten:
C-kielellä # -operaattoria käytetään muuttamaan makro-parametri merkkijonovakiona. Kun # -operaattori edeltää makroparametria, parametri muuntuu merkkijonon kirjaimeksi. Stringointia voidaan käyttää olio- ja toimintomaisissa makroissa.
Esimerkki:
#define STRINGIZING (x) #x
int main ()
printf (STRINGIZING (Hello World));
paluu 0;
Sisään Esimerkki 7.c meillä on merkkijono "Hello World" käyttämällä STRINGIZING-makroa.
Päätelmä:
Tämä artikkeli on oppinut kaikentyyppisistä makrokuvista Objektin kaltaiset makrot, Toimintomaiset makrot, Makro tunnuksen liittämistä varten, Makro merkkijonoille ja makro merkkijonoille C-kielellä. Nyt voimme käyttää makroa C-ohjelmassa epäilemättä.