Laten we het verschil tussen inline en macro bestuderen met behulp van een vergelijkingsgrafiek.
Vergelijkingstabel
Basis voor vergelijking | In lijn | macro |
---|---|---|
basis- | Inline-functies worden door de compiler geparseerd. | Macro's worden uitgebreid door de preprocessor. |
Syntaxis | inline return_type funct_name (parameters) {. . . } | #define macro_name char_sequence |
Sleutelwoorden Gebruikt | in lijn | #bepalen |
Gedefinieerd | Het kan binnen of buiten de klas worden gedefinieerd. | Het wordt altijd gedefinieerd aan het begin van het programma. |
evaluatie | Het evalueert het argument slechts één keer. | Het evalueert het argument elke keer dat het in de code wordt gebruikt. |
Uitbreiding | De compiler is mogelijk niet inline en breidt alle functies uit. | Macro's worden altijd uitgebreid. |
Automatisering | De korte functies, gedefinieerd binnen de klas, worden automatisch op inline-functies gemaakt. | Macro's moeten specifiek worden gedefinieerd. |
Toegang | Een inline-lidfunctie kan toegang krijgen tot de gegevensleden van de klasse. | Macro's kunnen nooit de leden van de klas zijn en hebben geen toegang tot de gegevensleden van de klas. |
Beëindiging | De definitie van inline-functie eindigt met de accolades aan het einde van de inlinefunctie. | Definitie van macro wordt beëindigd met de nieuwe regel. |
debugging | Debugging is eenvoudig voor een inline-functie, omdat tijdens de compilatie een foutcontrole wordt uitgevoerd. | Foutopsporing wordt moeilijk voor macro's omdat tijdens de compilatie geen foutcontrole plaatsvindt. |
Verbindend | Een inline-functie bindt alle statements in de body van de functie heel goed, omdat de body van de functie begint en eindigt met de accolades. | Een macro wordt geconfronteerd met het bindingprobleem als er meer dan één instructie is, omdat er geen beëindigingssymbool is. |
Definitie van Inline
Een inline-functie ziet eruit als een normale functie, maar wordt voorafgegaan door het trefwoord ' inline '. Inline-functies zijn korte lengtefuncties die worden uitgebreid op het moment van aanroepen, in plaats van te worden opgeroepen. Laten we inline-functies met een voorbeeld begrijpen.
# include namespace std; class voorbeeld {int a, b; public: inline void initialize (int x, int y) {a = x; b = y} void display () {cout << a << "" <In bovenstaand programma heb ik de functie-initialisatie () gedeclareerd en gedefinieerd als een inline-functie in de klasse "voorbeeld". De code van de initialisatie () -functie breidt uit waar deze wordt aangeroepen door het object van de klasse "example". De functie-aanduiding (), zoals gedefinieerd in het klasse-voorbeeld, wordt niet inline gedeclareerd maar kan door de compiler inline worden beschouwd als in C ++ wordt de functie die is gedefinieerd in de klasse automatisch inline gemaakt door de compiler, rekening houdend met de lengte van de functie.
- De inline-functie vermindert de overhead van het oproepen en terugbellen van functies, wat op zijn beurt de uitvoeringstijd van het programma vermindert. Ook worden de argumenten op de stapel gedrukt en worden registers opgeslagen wanneer een functie wordt aangeroepen en gereset wanneer de functie terugkeert, wat tijd kost, dit wordt vermeden door de inline-functies omdat het niet nodig is om lokale variabelen en formele parameters te maken elke keer .
- Inline-functies kunnen lid van de klas zijn en kunnen ook toegang krijgen tot het gegevenslid van de klas.
- Inline-functie verkort de uitvoeringstijd van het programma maar soms, als de lengte van de inline-functie groter is dan, neemt de omvang van het programma ook toe vanwege de gedupliceerde code. Daarom is het een goede gewoonte om zeer kleine functies in te voegen.
- Het argument van de inline-functie wordt slechts één keer geëvalueerd.
Definitie van Macro
Macro is een "preprocessors-richtlijn". Voor de compilatie wordt het programma onderzocht door de preprocessor en waar het de macro ook in het programma vindt, vervangt het die macro door de definitie ervan. Vandaar dat de macro wordt beschouwd als de "tekstvervanging". Laten we macro bestuderen met een voorbeeld.
# include # define GREATER (a, b) ((a <b)? b: a) int main (void) {cout << "Groter van 10 en 20 is" << GROTER ("20", "10") << "\ n"; retourneer 0; }
In de bovenstaande code heb ik een macrofunctie GREATER () opgegeven, die het grootste aantal van beide parameters vergelijkt en vindt. U kunt zien dat er geen puntkomma is om de macro te beëindigen als de macro alleen door de nieuwe regel wordt beëindigd. Omdat een macro slechts een tekstvervanging is, breidt deze de macrocode uit waar deze wordt opgeroepen.
- De macro's worden altijd in de hoofdletters gedefinieerd om het de programmeurs eenvoudig te maken om tijdens het lezen alle macro's in het programma te identificeren.
- De macro kan nooit de ledenfunctie van een klasse zijn en ook geen toegang hebben tot de gegevensleden van een klasse.
- De macrofunctie evalueert het argument elke keer dat het in de definitie verschijnt, wat resulteert in een onverwacht resultaat.
- Macro moet kleiner zijn omdat grotere macro's de code onnodig vergroten.
Belangrijkste verschillen tussen Inline en Macro
- Het basisverschil tussen inline en macro is dat een inline-functie wordt geparseerd door de compiler, terwijl de macro's in een programma worden uitgebreid met preprocessor.
- Het sleutelwoord dat wordt gebruikt om een inline-functie te definiëren, is " inline ", terwijl het sleutelwoord dat wordt gebruikt om een macro te definiëren " #define " is.
- Zodra de inline-functie binnen een klasse wordt gedecaleerd, kan deze binnen een klasse of buiten een klasse worden gedefinieerd. Aan de andere kant wordt een macro altijd gedefinieerd aan het begin van het programma.
- Het argument dat aan de inline-functies wordt doorgegeven, wordt tijdens compilatie slechts eenmaal geëvalueerd, terwijl het macro-argument wordt geëvalueerd elke keer dat een macro in de code wordt gebruikt.
- De compiler is mogelijk niet inline en breidt alle functies uit die binnen een klasse zijn gedefinieerd. Aan de andere kant worden macro's altijd uitgebreid.
- De korte functie die wordt gedefinieerd in een klasse zonder inline-trefwoord, worden automatisch inline-functies gemaakt. Aan de andere kant moet Macro specifiek worden gedefinieerd.
- Een functie die inline is, heeft toegang tot de leden van de klasse, terwijl een macro nooit toegang heeft tot de leden van de klas.
- Om een inline-functie te beëindigen, is een gesloten accolade vereist, terwijl een macro wordt beëindigd met het begin van een nieuwe lijn.
- Debugging wordt eenvoudig voor de ingebouwde functie omdat het tijdens de compilatie wordt gecontroleerd op fouten. Aan de andere kant, een macro wordt niet gecontroleerd tijdens het compileren, dus het debuggen van een macro wordt moeilijk.
- Als een functie een inline-functie binden de leden binnen een begin en een gesloten accolade. Aan de andere kant heeft macro geen enkel beëindigingssymbool, dus binden wordt moeilijk wanneer macro meer dan één instructie bevat.
conclusies:
De inline-functies zijn veel overtuigender dan de macrofunctie. C ++ biedt ook een betere manier om een constante te definiëren, die een sleutelwoord "const" gebruikt.