Luați în considerare următorul cod:
STARTINTEGER n = 5;
PRINT („Valoarea lui n este% d”, n);
SFÂRȘIT
Codul de mai sus nu este un cod C. valid.
Dar următorul cod este valid:
// Exemplul 1.c#define START int main ()
#define END
#define INTEGER int
#define PRINT (A, B) printf (A, B)
START
INTEGER n = 5;
PRINT („Valoarea lui n este% d”, n);
SFÂRȘIT
Înainte de compilare, macro-ul START, INTEGER, PRINT și END a fost înlocuit cu valoarea lor, iar codul devine un cod C valid. Putem verifica folosind următoarea comandă:
gcc -E Exemplul 1.cAceastă comandă se va afișa după extinderea tuturor macrocomenzilor.
Acum vom vedea diferite tipuri de macrocomenzi:
1. Macrocomenzi de tip obiect:
Sintaxă:
#define macro_name macro_value- Macro începe întotdeauna cu #define
- macro_name este un nume definit de utilizator al macro-ului
- macro_value este valoarea macro-ului. Poate fi orice, dar o linie și corpul macro se termină cu capetele acelei linii. Nu necesită punct și virgulă (;) la final. Spațiul este, de asemenea, luat în considerare.
Dacă macrocomanda are mai multe linii, o putem face după cum urmează:
#define macro_name macro_value1 \macro_value2 \
macro_value3
#define MAX 200
Această macrocomandă arată ca un obiect de date, de aceea acest tip de macrocomandă este numită macrocomandă de tip obiect.
// Exemplul 2.c//#include
#define MAX 200
int main ()
printf („Valoarea MAX este:% d”, MAX);
retur 0;
În Exapmle2.c, MAX este o macro. Din rezultat, observăm că MAX se înlocuiește cu valoarea sa 200.
2. Macro-uri funcționale:
Sintaxă:
#define macro_name () macro_valuemacro_name este un nume definit de utilizator al macro-ului. Perechea de paranteză trebuie pusă după macro_name. Nu este permis spațiu între macro_name și paranteză. De asemenea, putem transmite argumente în acest tip de macrocomenzi.
#define add (x, y) x + yAceastă macrocomandă arată ca un apel funcțional, de aceea acest tip de macrocomeneală numită macrocomandă funcțională.
// Exemplul 3.c#define add (x, y) x + y
int main ()
int a;
plutitor b;
a = adăuga (4,5);
b = adăugați (2.5,3.6)
retur 0;
În Exemplul 3.c, am văzut că spre deosebire de funcția lui C, macro-ul înlocuiește doar codul cu argumente fără a-l calcula. Deci, putem transmite diferite tipuri de date folosind aceeași macro.
Dacă punem un spațiu între numele macro și paranteză, acesta funcționează la fel ca o macro de tip obiect. Mai jos, C Exemplul ilustrează acest lucru.
// Exemplul 4.c#define add (x, y) x + y
int main ()
int a;
plutitor b;
a = adăuga (4,5);
b = adăugați (2.5,3.6)
În Exemplul 4.c, am văzut că adăugarea macro este înlocuită cu (x, y) x + y . La fel ca o macro de tip obiect.
3. Macro pentru lipirea jetonului:
În limbajul C, operatorul ## este utilizat pentru lipirea simbolurilor. Folosind acest operator, putem combina două jetoane valide într-un singur jeton valid.
Exemplu:
#define MARGE (x, y) x ## y
int main ()
int num = MARGE (52,34);
retur 0;
Dacă încercăm să lipim simbolul care nu generează un simbol valid, compilatorul C dă o eroare sau un avertisment.
// Exemplul 6.c#define MARGE (x, y) x ## y
int main ()
int num = MARGE (52, +);
retur 0;
În Exemplul 6.c, avem un mesaj de eroare deoarece, după o combinație de două jetoane, primim un jeton nevalid „52 +”.
4. Macro pentru Stringizing:
În limbajul C, operatorul # este folosit pentru a converti un parametru macro într-o constantă de șir. Când un operator # precede cu un parametru macro, parametrul se convertește într-un șir literal. Stringizarea poate fi utilizată pentru macro-uri de tip obiect și funcțional.
Exemplu:
#define STRINGIZING (x) #x
int main ()
printf (STRINGIZING (Hello World));
retur 0;
În Exemplul 7.c avem un șir „Hello World” folosind macrocomanda STRINGIZING.
Concluzie:
Acest articol a aflat despre toate tipurile de macro-like Macrocomenzi de tip obiect, Macro-uri funcționale, Macro pentru Token Pasting, Macro pentru Stringizing și Macro pentru Stringizing în limbaj C. Acum putem folosi o macro în programul nostru C fără nici o îndoială.