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& operator<<(std::ostream& o, const Complex& 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; }
// operator.cpp #include "complex.h" std::ostream& operator<<(std::ostream& o, const Complex& Cplx) { return o << Cplx.m_Real << " i" << Cplx.m_Imaginary; }
// main.cpp #include "complex.h" #include <iostream> int main() { Complex Foo(3.4, 4.5); std::cout << Foo << "\n"; return 0; }
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:
// complex.h ... inline std::ostream& operator<<(std::ostream& o, const Complex& Cplx) { return o << Cplx.m_Real << " i" << Cplx.m_Imaginary; } ...
// complex.cpp ... std::ostream& operator<<(std::ostream& o, const Complex& Cplx) { return o << Cplx.m_Real << " i" << Cplx.m_Imaginary; } ...
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!