Definieren von Inline-Memberfunktionen in .cpp-Dateien: Ein Rätsel
Während Inline-Memberfunktionen normalerweise in Headern platziert werden, um sie direkt während der Kompilierung einzubinden, Bestimmte Szenarien erfordern ihre Implementierung in .cpp-Dateien. Ein solcher Fall betrifft zirkuläre Includes, bei denen die Implementierung einer Inline-Member-Funktion in einer .cpp-Datei definiert werden muss.
Dilemma zirkulärer Includes
Betrachten Sie das folgende Beispiel :
A.h
<code class="cpp">#pragma once #include "B.h" class A { B b; };</code>
B.h
<code class="cpp">#pragma once class A; // forward declaration class B { inline A getA(); };</code>
B.cpp
<code class="cpp">#include "B.h" #include "A.h" inline A B::getA() { return A(); }</code>
In dieser Situation muss aufgrund des zirkulären Include zwischen A.h und B.h die Implementierung der Inline-Member-Funktion getA() in B.cpp definiert werden. Dies wirft jedoch eine grundlegende Frage auf:
Wird der Compiler inline getA() ordnungsgemäß ausführen?
Nein. Der Compiler inlinet eine Funktion nur dann, wenn ihre Definition am Verwendungsort verfügbar ist. Im obigen Beispiel ist die Definition von getA() nicht sichtbar, wenn sie aus anderen .cpp-Dateien aufgerufen wird, was zu einem „ungelösten externen“ Fehler beim Verknüpfen führt.
Bedeutung von Inline-Schlüsselwörtern
Nur das Inline-Schlüsselwort, das in der Definition außerhalb des Klassenkörpers (in diesem Fall in B.cpp) vorhanden ist, ist von Bedeutung. Das Inline-Schlüsselwort im Header (in B.h) dient als Deklaration und gibt an, dass die Implementierung an anderer Stelle bereitgestellt wird.
Alternativer Ansatz zur Definition von Inline-Memberfunktionen in .cpp-Dateien
Derzeit gibt es keine alternative Methode zum Definieren von Inline-Memberfunktionen in .cpp-Dateien. Der Standard erfordert, dass ihre Definition für eine ordnungsgemäße Inline-Erweiterung in Headern platziert wird.
Das obige ist der detaillierte Inhalt vonKönnen Sie Inline-Memberfunktionen in .cpp-Dateien definieren? Ein Blick auf zirkuläre Includes und Compiler-Verhalten.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!