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
Patricia ArquetteOriginal
2024-11-27 06:31:14172Durchsuche

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;
}

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

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!

Stellungnahme:
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