Warum kann ich die Inline-Member-Funktion nicht in einer anderen Datei definieren?

8

Ich habe drei Dateien:

1. Joy.h

%Vor%

2. Joy.cpp

%Vor%

3. main.cpp

%Vor%

Ich versuche sie zu kompilieren mit:

%Vor%

g ++ sagt:

%Vor%

Wer kann mir sagen, warum ...

Wie kann ich dieses Problem lösen, wenn ich die test() -Funktion in der .h-Datei nicht definieren will und immer noch möchte, dass es eine inline -Funktion ist?

    
Yishu Fang 10.03.2012, 17:42
quelle

5 Antworten

9

Wenn Sie eine Inline-Elementfunktion definieren, sollten Sie der Definition der Elementfunktion das Schlüsselwort inline voranstellen und die Definition in eine Headerdatei einfügen.

Wenn Sie eine Funktion grundsätzlich inline deklarieren, sagen Sie dem Compiler, wenn möglich, den Code für den Aufruf der Funktion durch den Inhalt der Funktion dort zu ersetzen, wo die Funktion aufgerufen wird. Die Idee ist, dass der Funktionskörper wahrscheinlich klein ist und das Aufrufen der Funktion mehr Aufwand erfordert als der Rumpf der Funktion selbst.

Um dies tun zu können, muss der Compiler die Definition sehen, während der Code, der die Funktion aufruft, bedeutet, dass die Definition im Header liegen muss, weil der Code, der die Funktion aufruft, nur Zugriff auf die Header-Datei hat .

Gut zu lesen:
[9.7] Wie geht es dir? dem Compiler mitteilen, eine Memberfunktion inline zu machen?

    
Alok Save 10.03.2012, 17:45
quelle
4

Aus dem Standard (N3242, 7.1.2.4):

  

Eine Inline-Funktion soll in jeder Übersetzungseinheit definiert werden, in der   es wird benutzt und soll in jedem Fall exakt dieselbe Definition haben.

Sehen Sie auch hier nach: Wie sagen Sie dem Compiler zu machen? eine Mitgliedsfunktion inline?

    
Bojan Komazec 10.03.2012 17:53
quelle
4

Der Compiler benötigt die vollständige Definition der Funktion, damit inline sein kann, von wo er aufgerufen wird. Dies ist nur möglich, wenn Sie es in der Kopfzeile selbst definieren.

Wie funktioniert die Funktion inline ?

Sagen Sie, Sie definieren dies:

%Vor%

und verwenden Sie es dann als:

%Vor%

übersetzt der Compiler diesen Code (grob gesagt) in diesen:

%Vor%

Eine solche Ersetzung von Funktionsaufruf durch den Funktionscode selbst wird als inlined bezeichnet. Sie können sagen, die Funktion ist inline.

Beachten Sie, dass das Schlüsselwort inline nur ein Hinweis für den Compiler ist: Es teilt dem Compiler wenn möglich in mich mit. Es ist nicht garantiert, dass jeder inline Funktionsaufruf vom Compiler inline sein wird.

    
Nawaz 10.03.2012 17:47
quelle
1

Wegen der Art und Weise, wie C ++ in die Kompilierungseinheit kompiliert wird (jede cpp-Datei in der Regel), kennt die Kompilierung einer cpp-Datei nicht die Implementation der Inlining-Funktion in einer anderen Kompilierungseinheit, daher kann sie nicht inline eingebunden werden. p>

Die Lösung besteht darin, die Implementierung der Inline-Funktion in die Header-Datei zu stellen, so dass alle Dateien, die den Kopf verwenden, Zugriff auf die Implementierung haben,

    
111111 10.03.2012 17:46
quelle
0
  

Eine Inline-Funktion ist eine Funktion, mit der der Compiler aufgefordert wurde, eine Inline-Erweiterung durchzuführen.

Daher ist der ganze Sinn einer inline Funktion , dass in Zeile . Es gibt keine Möglichkeit, es in einer anderen Quelldatei zu definieren, wenn Sie weiterhin möchten, dass es eine inline -Funktion ist.

    
ApprenticeHacker 10.03.2012 17:45
quelle

Tags und Links