Heim >Backend-Entwicklung >C++ >Warum erhalte ich „Multiple Definition'-Fehler in Header-Dateien und wie kann ich diese beheben?
Mehrere Definitionsfehler in Header-Dateien: Warum und wie man sie behebt
Compiler stoßen auf „mehrere Definitionsfehler“, wenn ihnen mehrere angezeigt werden Definitionen eines Symbols im selben Programm. Dies kann auftreten, wenn mehrere Quelldateien dieselbe Header-Datei enthalten, die jeweils dasselbe Symbol definiert.
Sehen wir uns das bereitgestellte Codebeispiel an:
// complex.h #include <iostream> class Complex { public: Complex(float Real, float Imaginary); float real() const { return m_Real; }; private: friend std::ostream& operator<< (std::ostream&, const Complex&); float m_Real; float m_Imaginary; }; std::ostream& operator<< (std::ostream& o, const Complex& Cplx) { return o << Cplx.m_Real << " i" << Cplx.m_Imaginary; }
Der Operator<< Die Funktion ist in der .h-Datei definiert, was sie zu einem Kandidaten für Mehrfachdefinitionen macht, da sie in mehreren Quelldateien enthalten ist.
// complex.cpp #include "complex.h" Complex::Complex(float Real, float Imaginary) { m_Real = Real; m_Imaginary = Imaginary; }
// main.cpp #include "complex.h" #include <iostream> int main() { Complex Foo(3.4, 4.5); std::cout << Foo << "\n"; return 0; }
Beim Kompilieren dieses Codes stößt der Compiler auf einen Fehler „Mehrfachdefinition“. für den Betreiber<< Funktion.
Warum nicht für real()?
Die Memberfunktion real() ist implizit inline, was bedeutet, dass der Compiler sie so behandelt, als ob sie inline deklariert wäre, obwohl es ist nicht explizit in der .h angegeben Datei.
Lösungen
Um das Problem der Mehrfachdefinition für den Operator zu lösen<< Funktion gibt es zwei Hauptalternativen:
Inline der Funktion:
Fügen Sie das Inline-Schlüsselwort zur Funktionsdefinition hinzu, um den Compiler anzuweisen, es zu inline:
inline std::ostream& operator<< (std::ostream& o, const Complex& Cplx) { return o << Cplx.m_Real << " i" << Cplx.m_Imaginary; }
Verschieben Sie die Definition in die .cpp-Datei:
Entfernen Sie die Funktionsdefinition aus der .h-Datei und platzieren Sie es in der entsprechenden .cpp-Datei:
// complex.cpp std::ostream& operator<< (std::ostream& o, const Complex& Cplx) { return o << Cplx.m_Real << " i" << Cplx.m_Imaginary; }
Andere Lösungen
Zusätzliche Lösungen umfassen:
Das obige ist der detaillierte Inhalt vonWarum erhalte ich „Multiple Definition'-Fehler in Header-Dateien und wie kann ich diese beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!