logo

Macro-urile și tipurile sale în C

În C, a macro este o bucată de cod dintr-un program care este înlocuită cu valoarea macro-ului. Macro este definit de #defini directivă. Ori de câte ori un nume de macrocomandă este întâlnit de compilator, acesta înlocuiește numele cu definiția macrocomenzii. Definițiile macro nu trebuie să fie terminate cu punct și virgulă ( ; ).

Exemple de macrocomenzi în C

Mai jos sunt programele pentru a ilustra utilizarea macrocomenzilor în C:



Exemplul 1

Exemplul de mai jos demonstrează utilizarea macrocomenzilor pentru a defini LIMIT.

C








// C program to illustrate macros> #include> // Macro definition> #define LIMIT 5> // Driver Code> int> main()> {> >// Print the value of macro defined> >printf>(>'The value of LIMIT'> >' is %d'>,> >LIMIT);> >return> 0;> }>

>

>

Ieșire

The value of LIMIT is 5>

Exemplul 2

Exemplul de mai jos demonstrează utilizarea macrocomenzilor pentru a găsi aria unui dreptunghi.

C




// C program to illustrate macros> #include> // Macro definition> #define AREA(l, b) (l * b)> // Driver Code> int> main()> {> >// Given lengths l1 and l2> >int> l1 = 10, l2 = 5, area;> >// Find the area using macros> >area = AREA(l1, l2);> >// Print the area> >printf>(>'Area of rectangle'> >' is: %d'>,> >area);> >return> 0;> }>

>

>

Ieșire

Area of rectangle is: 50>

Explicaţie
Din programul de mai sus, putem vedea că ori de câte ori compilatorul găsește ZONA (l, b) în program îl înlocuiește cu definiția macrocomenzilor, adică (livre) . Valorile transmise șablonului macro ZONA (l, b) va fi înlocuit și cu declarația (livre) . Prin urmare, ZONA (10, 5) va fi egal cu 10*5 .

Tipuri de macrocomenzi în C

Există două tipuri de macrocomenzi în limbajul C:

1. Macro-uri asemănătoare obiectelor

O macrocomandă asemănătoare obiectului este un simplu identificator care va fi înlocuit cu un fragment de cod. Se numește asemănător obiectului deoarece arată ca un obiect din cod care îl folosește. Este folosit în mod popular pentru a înlocui un nume simbolic cu o numerică/variabilă reprezentată ca o constantă.

Exemplu

Exemplul de mai jos este ilustrarea unei macrocomenzi simple, adică macrocomenzi asemănătoare obiectelor.

C




// C program to illustrate macros> #include> // Macro definition> #define DATE 31> // Driver Code> int> main()> {> >// Print the message> >printf>(>'Lockdown will be extended'> >' upto %d-MAY-2020'>,> >DATE);> >return> 0;> }>

>

>

Ieșire

Lockdown will be extended upto 31-MAY-2020>

2. Macro-uri în lanț

Macro-urile din interiorul macro-urilor sunt denumite macro-uri în lanț. În macrocomenzile în lanț, în primul rând, macro-ul părinte este extinsă, apoi macro-ul secundar este extins.

Exemplu

Programul de mai jos este ilustrarea unei macrocomenzi în lanț

C




// C program to illustrate macros> #include> > // Macro definition> #define INSTAGRAM FOLLOWERS> #define FOLLOWERS 138> > // Driver Code> int> main()> {> >// Print the message> >printf>(>'Geeks for Geeks have %dK'> >' followers on Instagram'>,> >INSTAGRAM);> > >return> 0;> }>

>

>

Ieșire

Geeks for Geeks have 138K followers on Instagram>

Explicaţie:
INSTAGRAM este extins mai întâi pentru a produce FOLLOWERS. Apoi macrocomanda extinsă este extinsă pentru a produce rezultatul ca 138K. Aceasta se numește înlănțuirea macro-urilor.

3. Macro-uri cu mai multe linii

O macrocomandă asemănătoare obiectului ar putea avea mai multe linii. Deci, pentru a crea o macrocomandă cu mai multe linii, trebuie să utilizați backslash-newline.

Exemplu

Mai jos este ilustrarea macrocomenzilor cu mai multe linii:

C




// C program to illustrate macros> #include> // Multi-line Macro definition> #define ELE 1,> >2,> >3> // Driver Code> int> main()> {> >// Array arr[] with elements> >// defined in macros> >int> arr[] = { ELE };> >// Print elements> >printf>(>'Elements of Array are: '>);> >for> (>int> i = 0; i <3; i++) {> >printf>(>'%d '>, arr[i]);> >}> >return> 0;> }>

>

>

Ieșire

Elements of Array are: 1 2 3>

4. Macro-uri asemănătoare funcțiilor

Aceste macrocomenzi sunt identice cu un apel de funcție. Acesta înlocuiește întregul cod în locul unui nume de funcție. Este necesară o pereche de paranteze imediat după numele macrocomenzii. Dacă punem un spațiu între numele macro și paranteze în definiția macro, apoi macro-ul nu va funcționa .
O macrocomandă asemănătoare unei funcții este prelungită numai dacă și numai dacă numele său apare cu o pereche de paranteze după ea. Dacă nu facem acest lucru, indicatorul funcției va obține adresa funcției reale și va duce la o eroare de sintaxă.

Exemplu

Exemplul de mai jos este ilustrarea macrocomenzilor asemănătoare funcțiilor

C


denumirea convențiilor java



// C program to illustrate macros> #include> // Function-like Macro definition> #define min(a, b) (((a) <(b)) ? (a) : (b))> // Driver Code> int> main()> {> >// Given two number a and b> >int> a = 18;> >int> b = 76;> >printf>(>'Minimum value between'> >' %d and %d is %d '>,> >a, b, min(a, b));> >return> 0;> }>

>

>

Ieșire

Minimum value between 18 and 76 is 18>

Iată un exemplu care va oferi o mai bună înțelegere a macrocomenzilor:

Problemă: Trebuie să găsim aria unui cerc prin definire AREA(r) Macro-uri.

C




#include> #define PI 3.1416> #define AREA(r) (PI*(r)*(r))> int> main() {> >float> r = 7;>// radius of circle> > >printf>(>'Area of Circle with radius %.0f: %.3f'>, r, AREA(r));> >return> 0;> }> // This code is contributed by Susobhan Akhuli>

>

>

Ieșire

Area of Circle with radius 7: 153.938>

Concluzie

Macro-urile sunt mici bucăți de cod care pot fi executate cu o singură comandă. Ele pot fi folosite pentru a automatiza sarcini, a simplifica procese complexe și a îmbunătăți productivitatea. Cu toate acestea, există și unele dezavantaje în utilizarea macrocomenzilor. Iată câteva dintre avantajele și dezavantajele macrocomenzilor:

Întrebări frecvente despre macrocomenzile C

Î1. Care sunt avantajele macro-urilor?

Răspuns:

    Productivitate crescută: macrocomenzile pot economisi timp și pot reduce erorile prin automatizarea sarcinilor repetitive. Personalizare: macrocomenzile pot fi personalizate pentru a se potrivi nevoilor specifice, permițând o mai mare flexibilitate în modul în care sarcinile sunt finalizate. Consecvență: macrocomenzile pot ajuta la asigurarea consecvenței sarcinilor urmând un set de instrucțiuni predeterminate. Eficiență: Macro-urile pot îndeplini sarcini mai rapid decât oamenii, îmbunătățind eficiența generală. Ușurință în utilizare: Macro-urile sunt ușor de creat și utilizat, necesitând puține sau deloc cunoștințe de programare

Q2. Care sunt dezavantajele Macro-urilor?

Răspuns:

    Riscuri de securitate: macrocomenzile pot reprezenta un risc de securitate dacă nu sunt securizate corespunzător sau dacă sunt folosite pentru a executa cod rău intenționat. Funcționalitate limitată: macrocomenzile ar putea să nu poată efectua sarcini mai complexe, limitându-le utilitatea. Probleme de compatibilitate: Macro-urile pot să nu fie compatibile cu toate aplicațiile software, limitându-le utilitatea. Întreținere: Macro-urile pot necesita întreținere și actualizări, ceea ce poate consuma mult timp și poate fi costisitoare. Dependență: dependența excesivă de macro-uri poate duce la scăderea abilităților de rezolvare a problemelor și a gândirii critice.

Q3. Poate o macro să accepte argumente?

Răspuns:

Da, macrocomenzile pot accepta argumente. De exemplu, MAX este o macrocomandă care ia două argumente (a și b) și returnează maximul dintre cele două.

Î4. Macro-urile pot fi recursive?

Răspuns:

Nu, macrocomenzile nu pot fi recursive. Dacă o macrocomandă devine recursivă, atunci definiția se referă la ea însăși și va duce la o buclă infinită în timpul preprocesării.