Heim > Backend-Entwicklung > C++ > Warum verursacht das Definieren einer Funktion in einer Header-Datei einen „Mehrfachdefinition'-Fehler in C?

Warum verursacht das Definieren einer Funktion in einer Header-Datei einen „Mehrfachdefinition'-Fehler in C?

Linda Hamilton
Freigeben: 2024-11-19 07:00:03
Original
992 Leute haben es durchsucht

Why Does Defining a Function in a Header File Cause a

Warum mehrere Symboldefinitionen im Header?

Beim Versuch, ein C-Programm mit mehreren Headerdateien zu kompilieren, kann der Fehler „Mehrfachdefinition von [Symbol ]." Dieser Fehler tritt auf, wenn dasselbe Symbol (z. B. eine Funktion oder Variable) mehr als einmal im Code definiert ist.

Betrachten Sie das folgende Beispiel:

// complex.h
#ifndef COMPLEX_H
#define 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&amp; o, const Complex&amp; Cplx);

   float m_Real;
   float m_Imaginary;
};
#endif // COMPLEX_H

// complex.cpp
#include "complex.h"

Complex::Complex(float Real, float Imaginary) {
   m_Real = Real;
   m_Imaginary = Imaginary;
}
Nach dem Login kopieren
// operator.cpp
#include "complex.h"

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

Das Kompilieren dieses Codes führt zu dem oben genannten Fehler. Das Problem ergibt sich aus der Definition des Operators << Funktion in „operator.cpp“. Während die Header-Datei eine Deklaration der Funktion enthält, ist die Definition in „operator.cpp“ nicht inline. Folglich generiert der Compiler zwei separate Definitionen der Funktion, was den Mehrfachdefinitionsfehler verursacht.

Im Gegensatz zu öffentlichen Mitgliedsfunktionen wie real(), die implizit inline sind, sind Nicht-Mitgliedsfunktionen wie „operator<<“ müssen explizit als Inline markiert werden, um mehrere Definitionen zu ermöglichen.

Um diesen Fehler zu beheben, kann man entweder:

  • Inline den Operator<< Funktionsdefinition in der Header-Datei:
// complex.h
...
inline std::ostream&amp; operator<<(std::ostream&amp; o, const Complex&amp; Cplx) {
   return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}
...
Nach dem Login kopieren
  • Verschieben Sie den Operator<< Definition in die Implementierungsdatei:
// complex.cpp
...
std::ostream&amp; operator<<(std::ostream&amp; o, const Complex&amp; Cplx) {
   return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}
...
Nach dem Login kopieren

Durch entweder Inlining der Funktion oder Platzieren ihrer Definition in der Implementierungsdatei kann der Fehler bei mehreren Definitionen vermieden werden, wodurch sichergestellt wird, dass das Programm erfolgreich kompiliert wird.

Das obige ist der detaillierte Inhalt vonWarum verursacht das Definieren einer Funktion in einer Header-Datei einen „Mehrfachdefinition'-Fehler in C?. 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