2017-08-20 1 views
2

Ich habe mich entschieden, etwas zu versuchen. Ich weiß, Makros sind böse und sollten vermieden werden, aber ich wollte sehen, was passieren wird, wenn ich so etwas mache.Mischen von Inline- und Makrofunktionen

#include <iostream> 
using namespace std; 
inline void add(int x, int y) { cout << "Inline: " << x + y << endl; } 
#define add(x,y) (cout << "Macro: " << x + y << endl) 

int main() 
{ 
    add(3,5); 
} 

Es gibt:

Macro: 8 

Wenn ich die #define Linie Inline-Kommentar aus zu arbeiten beginnt, und die Ausgabe wird zu Inline: 8.

Meine Frage ist, warum Compiler entscheidet, Makrofunktion anstelle von Inline zu verwenden. Vielen Dank!

Ich verwende Linux Mint 18.2, g++ 5.4.0, ohne Parameter g++ -g t2.cpp -o t2.

Antwort

5

Die Makrosubstitution erfolgt über den Preprozessor vor der Kompilierung. So sieht der Compiler nie add(3,5) - es sieht nur die Makro-Erweiterung.

+0

Oh, deshalb, wenn es ein '# define' gibt, ignoriert es' inline'. Weil '' define' '' add (3,5) 'ersetzt. Vielen Dank! Ich werde deine Antwort 10 Minuten später annehmen. Da stackoverflow die Zeit darauf begrenzt. –

+2

Der Compiler ignoriert "inline" nicht - er sieht den 'add (3,5)' -Funktionsaufruf überhaupt nicht, daher kann er die Funktion 'add' nicht aufrufen, inline oder nicht. –

2

Ein Makro kommt an dem Ort zu bewirken, es definiert ist, so dass die Inline-Funktion nicht durch das Makro ersetzt, aber Ihr Anruf vor der Kompilierung ersetzt. Beachten Sie auch, dass ein Makro nicht eine Funktion ist, teilt es dem Präprozessor ein Muster des Ersetzens von Texten.

Sie können den folgenden Befehl ausführen und die Ausgabedatei (your.i)

g++ -o your.i -E your.cpp 
      ^  

Und Sie werden die Inline-Funktion nicht betroffen durch das Makro :)

Option -E für G ++ Mittel "finden sehen Vorverarbeitung der Quelldatei, aber nicht kompilieren, nicht assemblieren und nicht verknüpfen ".

+0

Okay ... das ist interessant. Jeden Tag lerne ich etwas Neues. Danke iBug! Ich habe verstanden, was bei Neil Butterworths Antwort passiert. Jetzt weiß ich, wie man die Ausgabedatei sieht! ** Edit: ** Danke für die zusätzliche Mühe, mir zu erklären, was "-E" ist. –

+0

@ TuğberkKaanDuman Sie können diese Antwort als "akzeptiert" markieren, wenn Sie es für hilfreich halten. – iBug

+0

Ich habe versucht das -E und es gab eine Datei aus, die 18166 Zeilen lang ist. Es ist normal? o_o –

2

Es gibt keine "Makrofunktion". Compiler (tatsächlich Präprozessor) dreht gerade main in

int main() 
{ 
    (cout << "Macro: " << 3 + 5 << endl); 
} 
+0

Ich kannte den Namen nicht. Entschuldigung, aber warum wählt es stattdessen das Makro? –

+1

@ TuğberkKaanDuman Der Präprozessor wird vor dem Compiler ausgeführt und ersetzt den gesamten Makroaufruf durch seine Körper. Wenn also der Compiler tatsächlich mit dem Kompilieren beginnt, gibt es dort keinen Add-Call mehr. – VTT

+0

Danke @ VTT. Jetzt habe ich es besser verstanden! –