Preučimo razliko med inline in makro s pomočjo primerjalne tabele.
Primerjalna tabela
Podlaga za primerjavo | V vrsti | Makro |
---|---|---|
Osnovno | Vgrajene funkcije razčleni prevajalnik. | Makroje razširja s predprocesorjem. |
Sintaksa | inline return_type funct_name (parametri) {. . . } | #define macro_name char_sequence |
Uporabljene ključne besede | v vrsti | #define |
Določeno | Lahko je definiran znotraj ali zunaj razreda. | Vedno je določen na začetku programa. |
Vrednotenje | Argument vrednoti samo enkrat. | Vrednoti argument vsakič, ko ga uporabimo v kodi. |
Širitev | Prevajalnik ne sme vdelati in razširiti vseh funkcij. | Makri so vedno razširjeni. |
Avtomatizacija | Kratke funkcije, definirane znotraj razreda, se samodejno izvedejo na inline funkcije. | Makre je treba natančno opredeliti. |
Dostop | Funkcija članov v vrstici lahko dostopa do podatkovnih članov razreda. | Makri nikoli ne morejo biti člani razreda in ne morejo dostopati do podatkovnih članov razreda. |
Prekinitev | Funkcija definicije inline se konča s kodrastimi oklepaji na koncu funkcije inline. | Opredelitev makra se zaključi z novo vrstico. |
Odpravljanje napak | Odpravljanje napak je enostavno za inline funkcijo, saj se preverjanje napak izvede med prevajanjem. | Odpravljanje napak postane težko za makre, saj med prevajanjem ne pride do preverjanja napak. |
Vezava | Funkcija inline povezuje vse stavke v telesu funkcije zelo dobro kot telo funkcije in se konča s kodrastimi oklepaji. | Makro se sooča s problemom vezave, če ima več kot en stavek, saj nima terminacijskega simbola. |
Opredelitev inline
Funkcija inline izgleda kot redna funkcija, vendar pred njo pride ključna beseda » inline «. Vgrajene funkcije so funkcije kratke dolžine, ki se razširijo na točki njenega klica, namesto da se kličejo. Razumimo inline funkcije z zgledom.
#include using namespace std; primer razreda {int a, b; public: inline void inicializira (int x, int y) {a = x; b = y} void display () {cout << a << "<V zgornjem programu sem deklariral in definiral inicializacijo funkcije (), kot funkcijo inline v razredu »primer«. Koda funkcije inicializacije () se bo razširila tam, kjer jo kliče objekt razreda "primer". Funkcija display (), definirana v primeru razreda, ni deklarirana, vendar jo lahko prevajalnik obravnava kot vrstnega reda, v C ++ funkcija, ki je definirana v razredu, se avtomatsko vnese s strani prevajalnika glede na dolžino funkcije.
- Funkcija inline zmanjša obremenitev funkcije klicanja in vračanja, kar zmanjša čas izvajanja programa. Tudi argumenti so potisnjeni na sklad in registri se shranijo, ko je funkcija klicana in ponastavljena, ko se funkcija vrne, kar zahteva čas, to se izogne z inline funkcijami, ker ni potrebe po ustvarjanju lokalnih spremenljivk in formalnih parametrov. .
- Vgrajene funkcije so lahko član razreda in lahko dostopajo tudi do podatkovnega člana razreda.
- Inline funkcija skrajša čas izvajanja programa, včasih pa, če je dolžina inline funkcije večja, se bo zaradi podvojene kode povečala tudi velikost programa. Zato je dobra praksa, da vključite zelo majhne funkcije.
- Argument funkcije inline se oceni samo enkrat.
Opredelitev makra
Makro je »predprocesorska direktiva«. Pred kompilacijo program pregleduje predprocesor in kjer koli najde makro v programu, zamenja ta makro s svojo definicijo. Zato se makro obravnava kot »zamenjava besedila«. Preučimo makro z zgledom.
#include #define GREATER (a, b) ((a <b)? b: a) int main (void) {cout << "Večji od 10 in 20 je" << GREATER ("20", "10") << "\ t return 0; }
V zgornji kodi sem deklariral makro funkcijo GREATER (), ki primerja in najde večje število obeh parametrov. Opazite lahko, da ni nobenega podpičja za zaključek makra, ker se makro prekine samo z novo vrstico. Ker je makro samo zamenjava besedila, bo razširil kodo makra, na katerem je bil priklican.
- Makroje so vedno definirane z velikimi tiskanimi črkami, da bi programerji lažje prepoznali vse makre v programu med branjem.
- Makro nikoli ne more biti funkcija člana razreda, niti ne more dostopati do podatkovnih članov kateregakoli razreda.
- Makro funkcija oceni argument vsakič, ko se pojavi v definiciji, kar povzroči nepričakovani rezultat.
- Makro mora biti manjše velikosti, saj bodo večji makri po nepotrebnem povečali velikost kode.
Ključne razlike med vrstico in makrom
- Osnovna razlika med inline in makrom je v tem, da prevajalnik razčleni inline funkcije, medtem ko so makri v programu razširjeni s preprocesorjem.
- Ključna beseda, ki se uporablja za definiranje vgrajene funkcije, je » inline «, medtem ko je ključna beseda, ki se uporablja za definiranje makra, » #define «.
- Ko je notranja funkcija deklarirana znotraj razreda, jo je mogoče definirati znotraj razreda ali izven razreda. Po drugi strani pa je makro vedno definiran na začetku programa.
- Argument, ki je posredovan funkcijam v vrstici, se med prevajanjem oceni samo enkrat, medtem ko se argument makrov oceni vsakič, ko se v kodi uporabi makro.
- Prevajalnik ne sme vdelati in razširiti vseh funkcij, definiranih znotraj razreda. Po drugi strani pa so makri vedno razširjeni.
- Kratka funkcija, ki je definirana znotraj razreda brez ključne besede, je samodejno izdelana inline funkcije. Po drugi strani pa je treba natančno opredeliti makro.
- Funkcija, ki je vgrajena, lahko dostopa do članov razreda, medtem ko makro nikoli ne more dostopati do članov razreda.
- Za zaključitev funkcije inline je potrebna zaprta zavita oklepaja, medtem ko se makro zaključi z začetkom nove vrstice.
- Odpravljanje napak postane preprosto za funkcijo inlne, saj se med prevajanjem preverja morebitna napaka. Po drugi strani pa makro med prevajanjem ni preverjen, zato je debuganje makra težko.
- Funkcija je funkcija, ki povezuje člane znotraj začetka in zapira zavite oklepaje. Po drugi strani pa makro nima nobenega terminacijskega simbola, zato postane vezava težavna, ko makro vsebuje več izjav.
Sklepi:
Vgrajene funkcije so veliko bolj prepričljive kot makro funkcije. C ++ ponuja tudi boljši način za definiranje konstante, ki uporablja ključno besedo »const«.