Vorteil von Makro über Inline in C ++

7

Wir wissen, dass Inline-Werte günstig sind, da sie vom Compiler überprüft werden und dieselbe Operation (wie ++ x) nicht mehr als einmal ausgewertet wird, wenn sie als Argument im Vergleich zu Makros übergeben wird.

Aber in einem Interview wurde ich nach den spezifischen Vorteilen oder Umständen gefragt, wenn ein Makro für C ++ besser ist.

Kennt jemand die Antwort oder kann über diese Frage nachdenken?

    
S..K 25.01.2011, 06:10
quelle

9 Antworten

14

Das Einzige, was mir einfällt, sind einige Tricks, die Sie mit einem Makro machen können, das mit einer Inline-Funktion nicht möglich ist. Beim Kompilieren Tokens zusammenfügen und diese Art von Hacker.

    
Jeremy Friesner 25.01.2011, 06:20
quelle
8

Hier ist eine spezielle Situation, in der Makros nicht nur bevorzugt sind, sondern die einzige Möglichkeit, etwas zu erreichen.

Wenn Sie eine Protokollierungsfunktion schreiben möchten, die nicht nur eine Nachricht protokolliert, sondern auch die Datei & amp; Zeilennummer der Stelle, an der die Instanz aufgetreten ist, können Sie entweder Ihre Funktion direkt aufrufen, die Datei & amp; Zeilenwerte (oder Makros) direkt:

%Vor%

... oder, wenn Sie möchten, dass es automatisch funktioniert, müssen Sie sich auf ein Makro verlassen (Warnung: nicht kompiliert):

%Vor%

Dies kann nicht mithilfe von Vorlagen, Standardparametern, Standardkonstruktionen oder anderen Geräten in C ++ erreicht werden.

    
John Dibling 25.01.2011 06:29
quelle
4

Manchmal möchten Sie die Sprache auf eine Weise erweitern, die mit keiner anderen Methode möglich ist.

%Vor%

Dies druckt CHECK(x == 42) failed! .

    
ephemient 25.01.2011 06:24
quelle
1

Speziell in C ++ ist eine Verwendung von MACROS, die sehr oft auftauchen (mit Ausnahme des Debug-Drucks mit Datei und Zeile), die Verwendung von MACROS zum Ausfüllen einer Reihe von Standardmethoden in einer Klasse, die nicht von a geerbt werden kann Basisklasse. In einigen Bibliotheken, die benutzerdefinierte Mechanismen für RTTI, Serialisierung, Ausdrucksvorlagen usw. erstellen, stützen sie sich häufig auf eine Menge statischer const-Variablen und statischer Methoden (und möglicherweise spezielle Semantiken für einige überladene Operatoren, die nicht vererbt werden können), die fast immer die sind Gleich, muss aber zu jeder Klasse hinzugefügt werden, die der Benutzer in diesem Framework definiert. In diesen Fällen werden MAKROs oft so bereitgestellt, dass der Benutzer sich nicht darum kümmern muss, den gesamten notwendigen Code zu setzen (er muss nur das MACRO mit den Require-Informationen aufrufen). Wenn ich zum Beispiel ein einfaches RTTI-System (Run-Time Type Identification) erstelle, kann es erforderlich sein, dass alle Klassen eine TypeID haben und dynamisch castbar sind:

%Vor%

Das oben Genannte konnte nicht mit Vorlagen oder Vererbung erreicht werden, und es macht das Leben des Benutzers einfacher und vermeidet Codewiederholung.

Ich würde sagen, dass diese Art der Verwendung von MACROs in C ++ am weitesten verbreitet ist.

    
Mikael Persson 25.01.2011 07:10
quelle
1

Wie bereits erwähnt, können Makros Präprozessordirektiven verwenden: __FILE__ , __LINE__ zum Beispiel, aber natürlich können auch #include und #define für das Parameterverhalten nützlich sein:

%Vor%

Abhängig davon, ob __DEBUG__ definiert ist oder nicht (über #define oder über Compiler-Optionen), ist das Makro LOG aktiv oder nicht. Dies ist eine einfache Möglichkeit, Debug-Informationen überall in Ihrem Code zu haben, die einfach deaktiviert werden können.

Sie können auch daran denken, die Art der Speicherzuweisung zu ändern ( malloc wird neu definiert, um einen Speicherpool anstelle des standardmäßigen Heapspeichers zu bestimmen, usw. ...).

    
Emmanuel 25.01.2011 08:39
quelle
1

Inline-Funktionen sind, wie der Name schon sagt, auf funktionale Aufgaben, die Ausführung von Code beschränkt.

Makros haben eine viel breitere Anwendung, sie können beispielsweise Deklarationen erweitern oder ganze Sprachkonstrukte ersetzen. Einige Beispiele (geschrieben für C und C ++), die mit Funktionen nicht möglich sind:

%Vor%

Im Kontext von C ++ hat Boost viele weitere Beispiele, die mehr involviert und nützlicher sind.

Aber weil Sie mit solchen Makros in gewisser Weise die Sprache erweitern (nicht streng genommen, der Präprozessor ist ein Teil davon), mögen viele Leute Makros, besonders in der C ++ - Gemeinschaft, etwas weniger in der C-Gemeinschaft.

Wenn Sie solche Konstrukte verwenden, sollten Sie auf jeden Fall immer genau wissen, was zu erreichen ist, gut dokumentieren und gegen die Versuchung ankämpfen, Ihren Code zu verschleiern.

    
Jens Gustedt 25.01.2011 09:15
quelle
0

Ein Makro ist genau wie eine Textersetzungsdefinition.

Diese wesentlichen Unterschiede, die mir in den Sinn kommen, sind:

  • Es muss nicht funktional sein. Ich meine, es muss nicht unbedingt ein paar konsistente Klammern enthalten.
  • Es kann an anderer Stelle verwendet werden. Wie in einem Klassendeklarationsbereich oder sogar im globalen Gültigkeitsbereich. Es darf also nicht in den Bereich einer anderen Funktion fallen.

Sie müssen sie verwenden, wenn Sie Aktionen ausführen möchten, die mit Funktionen nicht ausgeführt werden können:

  • Initialisierung komplizierter Tabellen (macht Kern lesbarer)
  • Deklaration einiger spezieller Member wie Ereignis-IDs oder Tag-Klassen (wird häufig in MFC IMPLEMENT_DYNAMIC verwendet)
  • quetsche repetitive Deklarationen am Anfang von Funktionen
  • die bereits erwähnte Verwendung von __LINE__ , __FILE__ , ... für die Protokollierung
jdehaan 25.01.2011 06:39
quelle
0
%Vor%

Die Ausgabe für diesen Code ist 5 und 17. Makros werden textuell erweitert. Es ist nicht wie Funktionen.

Erklärung für dieses Beispiel:

sq (2 + 1) = 2 + 1 * 2 + 1 = 2 + 2 + 1 = 5

sq (2 + 5) = 2 + 5 * 2 + 5 = 2 + 10 + 5 = 17

    
Pradeep Vairamani 10.04.2012 12:32
quelle
-1

Ich würde zwei Verwendungen hinzufügen:

  1. MIN und MAX , bis C ++ 0x, da der Rückgabetyp von Hand deklariert werden musste, waren die gemischten min und max als eingefügte Funktionen alptraumhaft, während ein einfaches Makro dies im Blinzeln tat eines Auges.
  2. privacy : Sie können immer undef das Makro vor dem Beenden Ihrer Kopfzeile, Sie können nicht eine Inline-Funktion (oder ein anderes Symbol) "deklarieren". Dies ist auf das Fehlen einer geeigneten Modularität in C- und C ++ - Sprachen zurückzuführen.
Matthieu M. 25.01.2011 07:46
quelle

Tags und Links