Maison > développement back-end > C++ > Pourquoi mon code C génère-t-il une erreur « Définition multiple » ?

Pourquoi mon code C génère-t-il une erreur « Définition multiple » ?

Linda Hamilton
Libérer: 2024-11-20 04:32:02
original
506 Les gens l'ont consulté

Why Does My C   Code Throw a “Multiple Definition” Error?

Erreur de définition multiple : une solution aux définitions conflictuelles

En C, lors de la définition de fonctions ou de classes dans les en-têtes et de leur implémentation dans les fichiers source, les développeurs peuvent rencontrer l’erreur « définition multiple ». Cette erreur survient lorsque plusieurs unités de traduction (fichiers sources) contiennent des définitions pour le même identifiant.

Causes de définitions multiples

L'erreur « définition multiple » se produit lorsque les fichiers d'en-tête contenant des définitions sont inclus dans plusieurs unités de traduction. Cela peut se produire lorsque :

  • Un fichier d'en-tête est inclus à la fois dans un fichier source et dans son fichier d'en-tête correspondant.
  • Une définition est fournie dans un fichier d'en-tête au lieu d'une déclaration.

Comprendre l'erreur

Considérez l'exemple de code fourni :

// complex.h
class Complex
{
public:
   friend std::ostream& operator<<(std::ostream&, const Complex&);
};

// complex.cpp
std::ostream& operator<<(std::ostream&, const Complex&);
Copier après la connexion

Dans cet exemple, la définition de l'opérateur << ; est dans complex.h au lieu de complex.cpp. Cela peut conduire à une erreur de définition multiple car main.cpp et complex.cpp tenteront de définir le << opérateur pour la classe Complex.

Solutions aux définitions multiples

Les solutions à l'erreur de définition multiple sont :

  • Utiliser le mot clé "inline": En déclarant la fonction comme inline, vous autorisez plusieurs unités de traduction à fournir la définition sans provoquer de conflit. Cependant, les fonctions en ligne présentent certaines limites, telles que l'impact sur les performances des fonctions volumineuses.
  • Déplacer la définition vers le fichier source : Au lieu de définir l'opérateur << dans le fichier d'en-tête, déplacez-le vers le fichier source correspondant (complex.cpp). Cela garantit que la définition n'existe que dans une seule unité de traduction.

L'utilisation du mot-clé en ligne ou le déplacement de la définition vers le fichier source sont les solutions préférées pour éviter l'erreur de définition multiple.

Différence dans la gestion de real() et <<

Dans l'exemple de code, la fonction real() est déclarée dans complex.h, mais n'est pas définie. C'est pourquoi le compilateur ne signale pas d'erreur de définition multiple. Les fonctions membres déclarées dans les déclarations de classe sont implicitement intégrées, ce qui signifie que leurs définitions sont insérées dans toutes les unités de traduction qui incluent l'en-tête. Ce n'est pas le cas pour l'opérateur << fonction, qui est définie dans complex.h.

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