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 ?

Pourquoi la définition d'une fonction dans un fichier d'en-tête provoque-t-elle une erreur « Définition multiple » en C ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-19 07:00:03972parcourir

Why Does Defining a Function in a Header File Cause a

Pourquoi une définition multiple du symbole dans l'en-tête ?

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&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;
}
// 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;
}
// 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 :

  • Incorporer l'opérateur<< définition de la fonction dans le fichier d'en-tête :
// complex.h
...
inline std::ostream&amp; operator<<(std::ostream&amp; o, const Complex&amp; Cplx) {
   return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}
...
  • Déplacer l'opérateur<< définition dans le fichier d'implémentation :
// complex.cpp
...
std::ostream&amp; operator<<(std::ostream&amp; o, const Complex&amp; 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn