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
Libérer: 2024-11-19 07:00:03
original
1007 Les gens l'ont consulté

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;
}
Copier après la connexion
// 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;
}
Copier après la connexion
// main.cpp
#include "complex.h"
#include <iostream>

int main() {
   Complex Foo(3.4, 4.5);
   std::cout << Foo << "\n";
   return 0;
}
Copier après la connexion

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;
}
...
Copier après la connexion
  • 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;
}
...
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal