Maison >développement back-end >C++ >Pourquoi la définition d'une fonction dans un fichier d'en-tête provoque-t-elle une erreur « Définition multiple » en C ?
Lorsque vous essayez de compiler un programme C avec plusieurs fichiers d'en-tête, il est possible de rencontrer l'erreur « définition multiple de [symbole ]." Cette erreur se produit lorsque le même symbole (comme une fonction ou une variable) est défini plusieurs fois dans le code.
Considérons l'exemple suivant :
// 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; }
La compilation de ce code entraînera l'erreur susmentionnée. Le problème vient de la définition de l’opérateur<< fonction dans Operator.cpp. Bien que le fichier d'en-tête comprenne une déclaration de la fonction, la définition dans Operator.cpp n'est pas intégrée. Par conséquent, le compilateur génère deux définitions distinctes de la fonction, provoquant une erreur de définition multiple.
Contrairement aux fonctions membres publiques comme real(), qui sont implicitement intégrées, les fonctions non membres comme Operator<< doivent être explicitement marqués comme en ligne pour permettre plusieurs définitions.
Pour résoudre cette erreur, on peut soit :
// 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; } ...
En insérant la fonction ou en plaçant sa définition dans le fichier d'implémentation, l'erreur de définition multiple peut être évitée, garantissant ainsi que le programme se compile avec succès.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!