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?
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.
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.
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.
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:
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. ...).
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.
Ein Makro ist genau wie eine Textersetzungsdefinition.
Diese wesentlichen Unterschiede, die mir in den Sinn kommen, sind:
Sie müssen sie verwenden, wenn Sie Aktionen ausführen möchten, die mit Funktionen nicht ausgeführt werden können:
__LINE__
, __FILE__
, ... für die Protokollierung 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
Ich würde zwei Verwendungen hinzufügen:
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. 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. Tags und Links macros c++ inline c-preprocessor