Tarkastellaan vertailun ja makron välistä eroa vertailukaavion avulla.
Vertailukaavio
Vertailun perusteet | Linjassa | makro |
---|---|---|
perustiedot | Inline-toiminnot jäsentelee kääntäjä. | Makroja laajentaa esikäsittelijä. |
Syntaksi | inline return_type funct_name (parametrit) {. . . } | #define makro_nimi char_sequence |
Käytetyt avainsanat | linjassa | #määritellä |
määritellyt | Se voidaan määritellä luokan sisällä tai ulkopuolella. | Se määritellään aina ohjelman alussa. |
arviointi | Se arvioi argumenttia vain kerran. | Se arvioi argumentin aina, kun sitä käytetään koodissa. |
laajeneminen | Kääntäjä ei ehkä inline ja laajenna kaikkia toimintoja. | Makroja laajennetaan aina. |
automaatio | Luokan sisällä määritetyt lyhyet toiminnot tehdään automaattisesti inline-toimintoihin. | Makrot on määriteltävä erikseen. |
pääsy | Sisäinen jäsenfunktio voi käyttää luokan jäseniä. | Makrot eivät voi koskaan olla luokan jäseniä eivätkä voi käyttää luokan jäseniä. |
päättyminen | Sisäisen toiminnon määritelmä päättyy rullakannattimien kanssa inline-toiminnon lopussa. | Makron määritelmä päättyy uuteen linjaan. |
virheenkorjaus | Virheenkorjaus on helppoa inline-toiminnolla, koska virheen tarkistus tehdään kokoamisen aikana. | Vianmääritys on vaikeaa makroille, koska virheenkorjausta ei tapahdu kokoamisen aikana. |
sitova | Inline-funktio sitoo kaikki funktion rungossa olevat lausunnot hyvin hyvin kuin funktion runko alkaa ja päättyy kierteisiin kiinnikkeisiin. | Makro kohtaa sitovan ongelman, jos sillä on useampi kuin yksi lausunto, koska sillä ei ole päättymissymbolia. |
Määritelmä Inline
Sisäinen toiminto näyttää tavalliselta toiminnalta, mutta sitä edeltää avainsana ” inline ”. Inline-funktiot ovat lyhyen pituisia toimintoja, joita laajennetaan sen kutsun sijasta sen sijaan, että niitä kutsutaan. Ymmärrämme inline-toiminnot esimerkin avulla.
# sisällytetään käyttämällä nimiavaruutta std; luokan esimerkki {int a, b; julkinen: inline void initialize (int x, int y) {a = x; b = y} tyhjä näyttö () {cout << a << "" <Yllä olevassa ohjelmassa ilmoitin ja määrittelin funktion alustuksen () inline-funktiona luokassa ”esimerkki”. Alustustoiminnon () funktio laajenee, kun luokan “esimerkki” kohde kutsuu sitä. Luokan esimerkissä määriteltyä funktionäyttöä () ei ilmoiteta inlineiksi, mutta kääntäjä voi pitää sitä inlineina, kuten C ++: ssa luokittimen sisällä määritetty toiminto tehdään automaattisesti kääntäjälle, kun otetaan huomioon funktion pituus.
- Sisäinen toiminto vähentää toiminnon kutsumisen ja palauttamisen yleiskustannuksia, mikä puolestaan vähentää ohjelman toteuttamisaikaa. Myös argumentit työnnetään pinoon ja rekisterit tallennetaan, kun toiminto kutsutaan ja nollautuu, kun funktion palautus, joka vie aikaa, tämä vältetään inline-toiminnoilla, koska ei ole tarpeen luoda paikallisia muuttujia ja muodollisia parametreja joka kerta .
- Inline-toiminnot voivat olla luokan jäseniä, ja ne voivat käyttää myös luokan datan jäsentä.
- Inline-toiminto vähentää ohjelman suorittamisaikaa, mutta jos joskin inline-funktion pituus on suurempi, ohjelman koko kasvaa myös kaksoiskoodin takia. Siksi on hyvä käytäntö sisällyttää hyvin pieniä toimintoja.
- Inline-funktion argumenttia arvioidaan vain kerran.
Määritelmä Makro
Makro on esiprosessoridirektiivi. Ennen tietojenkäsittelyä esiohjainohjelma tutkii ohjelman, ja jos se löytää ohjelman makron, se korvaa makron määrityksellään. Näin makroa pidetään tekstin korvaamisena. Tutkitaan makro esimerkkiä.
#include #define GREATER (a, b) ((a <b)? b: a) int main (void) {cout << "Suurempi 10 ja 20 on" << GREATER ("20", "10") << "n"; paluu 0; }
Yllä olevassa koodissa julistin makrotoiminnon GREATER (), joka vertaa ja löytää molempien parametrien suuremman määrän. Voit havaita, että makron lopettamiseksi ei ole puolipisteitä, koska makro lopetetaan vain uudella rivillä. Koska makro on vain tekstin korvaaminen, se laajentaa makron koodia, johon sitä käytetään.
- Makrot määritellään aina isoilla kirjaimilla, jotta ohjelmoijat voivat helposti tunnistaa kaikki ohjelman makrot lukemisen aikana.
- Makro ei voi koskaan olla luokan jäsenfunktio, eikä se voi käyttää minkään luokan datan jäseniä.
- Makrofunktio arvioi argumentin joka kerta, kun se ilmenee määritelmässä, joka johtaa odottamattomaan tulokseen.
- Makron on oltava pienempi, koska suuremmat makrot lisäävät tarpeettomasti koodin kokoa.
Tärkeimmät erot Inline- ja Macro-versioissa
- Perusero inline- ja makro-ominaisuuksien välillä on, että kääntäjä käsittelee inline-funktioita, kun taas esiprosessori laajentaa ohjelman makroja.
- Inline-funktion määrittelyssä käytetty avainsana on " inline ", kun taas makron määrittelyssä käytetty avainsana on " #define ".
- Kun inline-toiminto on dekalreja luokan sisällä, se voidaan määritellä joko luokan sisällä tai luokan ulkopuolella. Toisaalta makro määritellään aina ohjelman alussa.
- Inline-funktioille siirretty argumentti arvioidaan vain kerran, kun kokoaminen tapahtuu, kun taas makro-argumentit arvioidaan joka kerta, kun koodia käytetään makrossa.
- Kääntäjä ei välttämättä inline ja laajenna kaikkia luokan sisällä määritettyjä toimintoja. Toisaalta makroja laajennetaan aina.
- Lyhyt funktio, joka on määritelty luokassa ilman sisäistä avainsanaa, tehdään automaattisesti inline-toimintoihin. Toisaalta makro olisi määriteltävä erikseen.
- Sisäinen funktio voi käyttää luokan jäseniä, kun taas makro ei koskaan pääse luokan jäseniin.
- Sisäisen toiminnon lopettamiseksi tarvitaan suljettu tukka, kun taas makro lopetetaan uuden rivin alussa.
- Virheenjäljitystoiminto on helppo suorittaa, koska se tarkistetaan kokoamisen aikana virheiden varalta. Toisaalta makroa ei tarkisteta kokoamisen aikana, joten makron vianmääritys on vaikeaa.
- Toiminto on, että inline-toiminto sitoo sen jäsenet alussa ja sulkeutuvat tukirenkaat. Toisaalta makrolla ei ole yhtään päätesymbolia, joten sitominen on vaikeaa, kun makro sisältää enemmän kuin yhden lausunnon.
johtopäätökset:
Sisäiset toiminnot ovat paljon vakuuttavampia kuin makrotoiminto. C ++ tarjoaa myös paremman tavan määritellä vakio, joka käyttää ”const”-avainsanaa.