Erinevus C ++ tekstisisese ja makro vahel

Autor: Laura McKinney
Loomise Kuupäev: 2 Aprill 2021
Värskenduse Kuupäev: 15 Mai 2024
Anonim
Erinevus C ++ tekstisisese ja makro vahel - Tehnoloogia
Erinevus C ++ tekstisisese ja makro vahel - Tehnoloogia

Sisu


Makro on juhend, mis laieneb selle kutsumise ajal. Funktsioone saab ka määratleda, näiteks makrosid. Sarnaselt laienevad ka sisemised funktsioonid kutsumise hetkel. Üks esmane erinevus sisemise ja makrofunktsiooni vahel on see, et sisemised funktsioonid on laiendatud ajal koostamine, ja makrod laiendatakse, kui programm töötleb eeltöötleja.

Uurime võrdleva diagrammi abil erinevust tekstisisese ja makro vahel.

  1. Võrdlusdiagramm
  2. Definitsioon
  3. Peamised erinevused
  4. Järeldus

Võrdlusdiagramm

Võrdluse alusJärjekorrasMakro
Põhiline Sidusfunktsioone parsib kompilaator.Makrot laiendab eeltöötleja.
Süntaksinline return_type funct_name (parameetrid) {. . . }#defineeri makro_nimi char_sequence
Kasutatud märksõnadjärjekorras
#defineeri
MääratletudSeda saab määratleda klassis või väljaspool seda.See määratletakse alati programmi alguses.
HindamineTa hindab argumenti ainult üks kord.See hindab argumenti iga kord, kui seda koodis kasutatakse.
Laiendamine Kompilaator ei pruugi kõiki funktsioone integreerida ega laiendada.Makrot laiendatakse alati.
AutomatiseerimineKlassis määratletud lühikesed funktsioonid tehakse automaatselt rinnasisesteks funktsioonideks.Makrod tuleks konkreetselt määratleda.
JuurdepääsSidusliikme funktsioon pääseb juurde klassi andmeliikmetele.Makrod ei saa kunagi olla klassi liikmed ega pääse juurde klassi andmeliikmetele.
LõpetamineInline-funktsiooni määratlus lõpeb lokkisulgudega inline-funktsiooni lõpus.Makro määratlus lõpeb uue reaga.
SilumineSidusrežiimi silumine on lihtne, kuna kompileerimise ajal kontrollitakse tõrkeid.Silumine muutub makrode jaoks keeruliseks, kuna vigade kontrollimist kompileerimise ajal ei toimu.
KöitmineInline-funktsioon seob funktsiooni põhiosas olevad väited väga hästi, kuna funktsiooni põhiosa algab ja lõpeb lokkisulgudega.Makro seisab siduva probleemiga silmitsi, kui sellel on rohkem kui üks avaldus, kuna sellel pole lõpetamise sümbolit.


Inline määratlus

Sisefunktsioon näeb välja nagu tavaline funktsioon, kuid sellele eelneb märksõna „järjekorras“. Inline-funktsioonid on lühikese pikkusega funktsioonid, mida laiendatakse selle kutsumise hetkel, selle asemel, et helistada. Saame aru sisemistest funktsioonidest näitega.

# kaasata nimeruumi std kasutamine; klassinäide {int a, b; avalik: inline void initsialiseerib (int x, int y) {a = x; b = y} tühine kuva () {cout << a << "" <

Ülaltoodud programmis kuulutasin ja määratlesin funktsiooni initsialiseeriva () funktsiooni klassis “näide” sisaldava funktsioonina. Initsialiseerimisfunktsiooni () kood laieneb, kui sellele on kutsutud klassi “näide” objekt. Klassinäites määratletud funktsiooni kuva () ei kuulutata siseseks, kuid koostaja võib seda pidada sisemiseks, kuna C ++-s muudab kompilaator klassis määratletud funktsiooni automaatselt funktsiooni pikkuse järgi rivisiseselt.


  • Inline-funktsioon vähendab funktsioonile helistamise ja tagastamise üldkulusid, mis omakorda lühendab programmi täitmise aega.Samuti lükatakse argumendid virna ja registrid salvestatakse funktsiooni kutsumisel ja lähtestatakse funktsiooni tagasipöördumisel, mis võtab aega, seda väldivad sisemised funktsioonid, kuna iga kord pole vaja luua kohalikke muutujaid ja formaalseid parameetreid .
  • Sidusfunktsioonid võivad olla klassi liikmed ja pääsevad juurde ka klassi andmeliikmele.
  • Inline-funktsioon vähendab programmi täitmise aega, kuid mõnikord, kui in-line-funktsiooni pikkus on suurem, suureneb dubleeritud koodi tõttu ka programmi maht. Seega on hea tava siduda väga väikesed funktsioonid.
  • Inline-funktsiooni argumenti hinnatakse ainult üks kord.

Makro määratlus

Makro on „eeltöötlejate direktiiv”. Enne kompileerimist uurib eeltöötleja programmi ja kui ta leiab programmist makro, asendab ta selle makro määratlusega. Seetõttu peetakse makro “asendajaks”. Uurime näiteks makro.

# kaasata #define ROHKEM (a, b) ((a <b)? b: a) int main (tühine) {cout << "10-st ja 20-st suurem on" << SUUREM ("20", "10") << " n"; tagasi 0; }

Ülaltoodud koodis kuulutasin makrofunktsiooni GREATER (), mis võrdleb ja leiab mõlema parameetri suurema arvu. Võite täheldada, et makro lõpetamiseks pole semikoolonit, kuna makro lõpeb ainult uus rida. Kuna makro on lihtsalt asendaja, laiendab see makro koodi, kuhu see kutsutakse.

  • Makrod määratletakse alati suurtähtedega lihtsalt selleks, et programmeerijatel oleks lugemise ajal programmi kõigi makrode tuvastamine hõlbus.
  • Makro ei saa kunagi olla klassi liikme funktsioon ega pääse juurde ühegi klassi andmeliikmetele.
  • Makrofunktsioon hindab argumenti iga kord, kui see määratlusesse ilmub, mille tulemuseks on ootamatu tulemus.
  • Makro suurus peab olema väiksem, kuna suuremad makrod suurendavad asjatult koodi suurust.
  1. Põhiline erinevus tekstisisese ja makro vahel on see, et kompilaator parsib tekstisiseseid funktsioone, samal ajal kui programmi makrosid laiendab eeltöötleja.
  2. Sidusfunktsiooni määratlemiseks kasutatakse märksõna „järjekorras”Arvestades, et makro määratlemiseks kasutatakse märksõna“#defineeri“.
  3. Kui tekstisisene funktsioon on klassi sees ühe kümnendkohaga, saab seda määratleda kas klassisiseselt või klassiväliselt. Teisest küljest määratletakse makro alati programmi alguses.
  4. Sisefunktsioonidele edastatud argumenti hinnatakse kompileerimise ajal ainult üks kord, samas kui makroargumenti hinnatakse iga kord, kui makro kasutatakse koodis.
  5. Kompilaator ei tohi kõiki klassis määratletud funktsioone ritta ja laiendada. Teisest küljest laiendatakse makrosid alati.
  6. Lühike funktsioon, mis määratletakse klassis ilma tekstisisese märksõnata, tehakse automaatselt sisemiseks funktsiooniks. Teisest küljest tuleks makro konkreetselt määratleda.
  7. Sidusfunktsioon pääseb klassi liikmetele juurde, samas kui makro ei pääse klassi liikmetele kunagi juurde.
  8. Inline-funktsiooni lõpetamiseks on vaja suletud lokkis traksidega, samas kui makro lõpetatakse uue rea algusega.
  9. Silumine muutub inlne funktsiooni jaoks lihtsaks, kuna seda kontrollitakse kompileerimise käigus võimalike vigade osas. Teisest küljest ei kontrollita makro kompileerimise ajal, nii et makro silumine muutub keeruliseks.
  10. Funktsioonina seob rullfunktsioon oma liikmeid stardi- ja suletud lokirullide piires. Teisest küljest pole makroel mingit lõpetamise sümbolit, nii et sidumine muutub raskeks, kui makro sisaldab rohkem kui ühte avaldust.

Järeldused:

Sisefunktsioonid on palju veenvamad kui makrofunktsioonid. C ++ pakub ka paremat viisi konstandi määratlemiseks, mis kasutab märksõna “const”.