Heim > Backend-Entwicklung > C++ > Warum erhalte ich „Multiple Definition'-Fehler in Header-Dateien und wie kann ich diese beheben?

Warum erhalte ich „Multiple Definition'-Fehler in Header-Dateien und wie kann ich diese beheben?

Patricia Arquette
Freigeben: 2024-11-27 06:31:14
Original
179 Leute haben es durchsucht

Why Do I Get

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&amp; operator<< (std::ostream&, const Complex&);
   float m_Real;
   float m_Imaginary;
};

std::ostream&amp; operator<< (std::ostream&amp; o, const Complex& Cplx) {
   return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}
Nach dem Login kopieren

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;
}
Nach dem Login kopieren
// main.cpp
#include "complex.h"
#include <iostream>
int main() {
   Complex Foo(3.4, 4.5);
   std::cout << Foo << "\n";
   return 0;
}
Nach dem Login kopieren

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&amp; operator<< (std::ostream&amp; o, const Complex& Cplx) {
   return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}
Nach dem Login kopieren

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&amp; operator<< (std::ostream&amp; o, const Complex& Cplx) {
   return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}
Nach dem Login kopieren

Andere Lösungen

Zusätzliche Lösungen umfassen:

  • Pragma einmal:Verwenden einer Präprozessoranweisung in der .h-Datei, um mehrere zu unterdrücken Einschlüsse.
  • Modulsystem: Verwendung eines Modulsystems (C 20 und höher) zur Handhabung von Abhängigkeiten zwischen Quelldateien.
  • Header-Schutz: Sicherstellen dass die .h-Datei ein eindeutiges Makro definiert, um mehrere Einschlüsse zu verhindern.

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage