Maison >développement back-end >C++ >Pourquoi est-ce que j'obtiens des erreurs « Définitions multiples » dans les fichiers d'en-tête et comment puis-je les corriger ?

Pourquoi est-ce que j'obtiens des erreurs « Définitions multiples » dans les fichiers d'en-tête et comment puis-je les corriger ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-27 06:31:14139parcourir

Why Do I Get

Erreurs de définitions multiples dans les fichiers d'en-tête : pourquoi et comment les résoudre

Les compilateurs rencontrent des erreurs de « définitions multiples » lorsqu'ils se voient présenter plusieurs définitions d'un symbole dans le même programme. Cela peut se produire lorsque plusieurs fichiers sources incluent le même fichier d'en-tête, chacun définissant le même symbole.

Examinons l'exemple de code fourni :

// 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&, const Complex&);
   float m_Real;
   float m_Imaginary;
};

std::ostream&amp; operator<< (std::ostream&amp; o, const Complex& Cplx) {
   return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}

L'opérateur<< La fonction est définie dans le fichier .h, ce qui en fait un candidat pour une définition multiple puisque plusieurs fichiers sources l'incluront.

// complex.cpp
#include "complex.h"
Complex::Complex(float Real, float Imaginary) {
   m_Real = Real;
   m_Imaginary = Imaginary;
}
// main.cpp
#include "complex.h"
#include <iostream>
int main() {
   Complex Foo(3.4, 4.5);
   std::cout << Foo << "\n";
   return 0;
}

Lors de la compilation de ce code, le compilateur rencontre une erreur « définition multiple » pour l'opérateur≪≪ function.

Pourquoi pas pour real() ?

La fonction membre real() est implicitement intégrée, ce qui signifie que le compilateur la traite comme si elle était déclarée en ligne même si il n'est pas explicitement spécifié dans le fichier .h.

Résolutions

À résoudre le problème de définition multiple pour l'opérateur<< fonction, il existe deux alternatives principales :

Inline la fonction :
Ajoutez le mot-clé inline à la définition de la fonction pour demander au compilateur de l'inline :

inline std::ostream&amp; operator<< (std::ostream&amp; o, const Complex& Cplx) {
   return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}

Déplacez la définition vers le fichier .cpp :
Supprimez la définition de fonction du fichier .h et placez-la dans le fichier .cpp correspondant :

// complex.cpp
std::ostream&amp; operator<< (std::ostream&amp; o, const Complex& Cplx) {
   return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}

Autres solutions

Les solutions supplémentaires incluent :

  • Pragma une fois : Utilisation d'une directive de préprocesseur dans le fichier .h pour supprimer plusieurs inclusions.
  • Système de modules : Utilisation d'un système de modules (C 20 et supérieur) pour gérer les dépendances entre les fichiers source.
  • Protections d'en-tête : Assurer que le fichier .h définit une macro unique pour éviter les inclusions multiples.

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