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
Libérer: 2024-11-27 06:31:14
original
161 Les gens l'ont consulté

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

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;
}
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

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

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

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!

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