2017-10-31 5 views
-3

Ich muss verstehen, wie dieser Code funktioniert:Ich verstehe nicht das Verhalten von #define Makro in C++

#define foo1(a) (a * a)    // How does this work? 
inline int foo2(int a) { return (a * a); } 
int goo1(int x) { return foo1(foo2(x)); } 
int goo2(int& x) { return x = foo2(foo1(x)); } 
int goo3(int& x, int y) { return foo2(foo1(y + 1)); } 
void goo4(int& x, int y) { x = foo1(foo2(y + 1)); } 

int main(){ 
int i = 2, j = 1, a = 2+3; 

cout << "foo1 = " << foo1(1+2) << "\n"; // How does this work? 
cout << "foo2 = " << foo2(2 + 1) << "\n"; 
cout << "goo1 = " << goo1(i) << "\n"; 
cout << "goo2 = " << goo2(j) << "\n"; 
cout << "goo3 = " << goo3(i, j) << "\n"; // How does this work? 
goo4(i, j); 
cout << " i = " << i << " j = " << j << "\n"; 
} 

Aber ich scheine nicht das Verhalten dieser Funktion verstehen zu können:

#define foo1(a) (a * a) 

und daher verstehe ich nicht, den Ausgang dieser beiden Funktionsaufrufe:

foo1(1+2) 
goo3(i, j) 

Dies ist der Ausgang des p rogram:

foo1 = 5 
foo2 = 9 
goo1 = 16 
goo2 = 1 
goo3 = 9 
i = 16 j = 1 

Ich kann nicht sehen, warum foo1 nicht wie foo2 verhalten. Würde mir jemand erklären, wie dieses #define-Makro funktioniert?

HINWEIS: Ich darf den Code nicht ändern, ich versuche nur, die Ausgabe zu verstehen.

+1

verwenden aus diesem Grund Sie Inline-Funktionen zu tun, anstatt #defines – pm100

+0

versuchen '#define foo1 (a) ((a) * (a))' wenn Sie müssen definieren – pm100

+1

# define foo1 (a) ((a) * (a)). Du hast keine Makros gelebt, bis du C kennst und gelernt hast, sie nicht zu benutzen. –

Antwort

2

Nun, es ist wirklich einfach.

foo1(1 + 2) 

wird sich in:

(1 + 2 * 1 + 2) 

die eigentlich:

1 + 2 + 2 = 5 

Dies ist, wie Makros arbeiten.

2

Makros sind keine Funktionen.

Makros TEXT ersetzen. Also, wenn Sie

#define foo1(a) (a * a) 

jede Instanz von foo1( haben ... ) mit irgendetwas zwischen dann Klammer wird als Text erweitert werden, nicht als Ausdruck. Also, wenn Sie foo1(1 + 2) haben es verwandelt sich in (1 + 2 * 1 + 2)

+0

Nun, vielen Dank! Es war viel einfacher als ich dachte. – siama

0

Der Unterschied ist, die foo1 von #define definiert ist keine Funktion, während foo2 ist.

Beim Kompilieren ersetzt der Compiler das Schlüsselwort foo1 (Parameter) in Ihrem Code durch (Parameter * Parameter).

Bedeutung,

cout << "foo1 = " << foo1(1+2) << "\n"; // How does this work?

cout << "foo1 = " << (1+2 * 1+2) << "\n"; // How does this work

wird durch den folgenden Code ersetzt werden?

(Weil hier der Parameter 1 + 2, statt 3.)

Das Ergebnis ist 1 + 2 * 1 + 2, die 5.

da es nun Blick auf foo2 lassen, ist eine Inline-Funktion, der Compiler wird es nicht ersetzen.Wenn Ihr Code in eine ausführbare Datei kompiliert wird und die ausführbare Datei ausgeführt wird, wird zuerst der Ausdruck 2 + 1 berechnet und das Ergebnis 3 an foo2() übergeben.

Abschließend liegt der Unterschied wirklich in der Kompilierung Ihres Codes. Sie benötigen möglicherweise mehr Wissen darüber, was dort passiert.

1

Makro ist keine Funktion. Der Compiler wird alle Makros erweitern und dann kompilieren. Um den erweiterten Code zu sehen, können Sie mit dem folgenden Befehl -E-Option in gcc verwenden:

gcc -E <source code> -o <preprocessed file name> 

oder in Visual C++ unter Konfiguration Eigenschaften-> C/C++ -> Preprocessor, setzen Sie "Generate vorverarbeiteten Datei".

BTW, Ihr Makro ist problematisch. Sie sollten

#define foo1(a) ((a) * (a)) 

statt

#define foo1(a) (a * a) 
+0

Danke. Ich habe nur diesen Code erhalten, um zu verstehen, was er tut, ich weiß, dass das Makro problematisch ist, aber es soll so für Lernzwecke sein :) – siama

Verwandte Themen