Erreur de définition multiple en C++
Lorsqu'une fonction ou variable a plusieurs définitions dans divers fichiers source, la procédure de liaison se traduit par une erreur de définition multiple. Pour garantir l'uniformité et la précision du programme, le linker n'attend qu'une seule définition sur tous les fichiers source.
En règle générale, l'erreur ressemble à ceci:
Erreur: définition multiple de 'function_name'Il est crucial pour chaque développeur C ++ de comprendre la cause de cette erreur et de savoir comment le réparer.
Facteurs qui conduisent à plusieurs erreurs de définition en C++
Des erreurs de définition multiples peuvent se produire dans votre code C ++ pour plusieurs raisons comme indiqué ci-dessous:
1: plusieurs définitions de la même fonction ou variable dans un fichier source
Si vous définissez accidentellement la même fonction ou variable plusieurs fois dans le même fichier source, vous rencontrerez une erreur de définition multiple.
2: fonction ou variable définie dans un fichier d'en-tête
Lorsqu'une fonction ou variable est déclarée dans un fichier d'en-tête et que le fichier d'en-tête est référencé par de nombreux fichiers source, tout fichier source qui a un en-tête contiendra également une définition de la fonction ou de la variable. Cela génère l'erreur de plusieurs définitions.
3: Déclarer plusieurs fois la même fonction ou variable dans le même fichier source
Si vous déclarez accidentellement la même fonction ou variable plusieurs fois dans le même fichier source, vous rencontrerez une erreur de définition multiple lors de la liaison. En effet, le linker n'attend qu'une seule définition de chaque fonction ou variable sur tous les fichiers source.
Correction de l'erreur avec plusieurs définitions d'une fonction en C++
Les techniques suivantes peuvent être utilisées pour corriger plusieurs erreurs de définition en C ++:
1: utilisez des prototypes de fonction et des variables externes
Une technique pour corriger plusieurs erreurs de définition en C ++ consiste à déclarer une fonction ou une variable à l'aide de prototypes de fonction ou de variables externes, plutôt que de les spécifier dans un fichier d'en-tête. Ce faisant, la fonction ou la variable ne sera définie qu'une seule fois dans le fichier source, évitant ainsi l'erreur.
Ce qui suit est une syntaxe de code pour la solution ci-dessus.
// entête.HDans la syntaxe ci-dessus, la fonction sous est déclaré dans le fichier d'en-tête en utilisant le mot-clé externe, ce qui indique qu'il est défini ailleurs. La définition réelle est ensuite fournie dans le fichier source. Le #ifndef header_h et #Define Header_H Les lignes comprennent des gardes qui garantissent que le fichier d'en-tête n'est inclus qu'une seule fois dans le même fichier source pour éviter de redéfinir la fonction.
2: Utiliser des fonctions ou des variables statiques
Si une fonction ou une variable n'est utilisée que dans un seul fichier source, déclarez-la comme statique. Cela restreint sa portée au fichier source actuel, et le linker ne le considérera pas lors de la liaison. Ce faisant, vous vous assurez que la fonction ou la variable n'est définie qu'une seule fois et ne peut être accessible à partir d'autres fichiers.
Déclarer une fonction ou une variable car statique restreint sa portée au fichier source actuel et garantit qu'il n'est défini qu'une seule fois, ce qui rend votre code plus modulaire et plus facile à entretenir
De plus, si vous avez plusieurs fonctions dans différents fichiers, vous pouvez facilement les utiliser dans tout autre projet.
Considérez la syntaxe de code suivante comme exemple:
// les fonctions.cppDans la syntaxe ci-dessus, le "statique" Le mot-clé est utilisé pour définir une fonction appelée "Once_Used_function". Cette fonction ne peut être accessible que dans le même fichier source et ne peut pas être accessible à partir d'autres fichiers liés à ce fichier source. Cela garantit que la fonction n'est définie qu'une seule fois et ne peut pas être modifiée ou accessible accidentellement à partir d'autres parties du programme.
3: Implémentez les fonctions en ligne
Envisagez d'utiliser des fonctions en ligne pour les fonctions courtes fréquemment appelées. Cela éliminera le besoin d'une définition distincte, car le compilateur peut remplacer directement l'appel de la fonction par le code de la fonction.
Considérez la syntaxe de code suivante comme exemple:
// entête.HDans la syntaxe ci-dessus, le mot-clé «en ligne» est utilisé pour définir une fonction appelée «sub», qui prend deux arguments entiers et renvoie leur différence. En définissant cette fonction comme en ligne, le compilateur remplacera l'appel de fonction par le code de fonction réel au moment de la compilation, éliminant le besoin d'une définition de fonction distincte.
4: Utiliser les espaces de noms
En utilisant des espaces de noms, vous pouvez empêcher le linker de trouver plusieurs définitions avec le même nom. Les espaces de noms fournissent un moyen de regrouper les déclarations et les définitions liées dans une seule portée nommée, ce qui facilite l'organisation et la gestion des grandes bases de code.
Considérez la syntaxe de code suivante comme exemple:
// source_code_1.cppDans la syntaxe ci-dessus, deux fichiers source différents ont une fonction appelée «sub» avec la même signature. Pour éviter les conflits de dénomination, chaque fonction est définie dans un espace de noms distinct: "source_code_1" et "source_code_2". De cette façon, les fonctions sont accessibles à partir de leurs espaces de noms respectifs sans provoquer de conflits de dénomination. Lorsque vous appelez la fonction à partir d'autres parties de la base de code, vous devez spécifier l'espace de noms pour indiquer la version de la fonction que vous souhaitez appeler.
Conclusion
Lorsque les programmeurs et les développeurs définissent et utilisent deux fois la même fonction, le système devient confus, conduisant à l'erreur typique de plusieurs définitions des fonctions C ++. Parce que C ++ peut montrer des erreurs et des défauts inattendus dans des fichiers qui semblent corrects, les développeurs jouissent d'une expérience dynamique en travaillant avec elle. Par conséquent, ce guide a expliqué l'erreur de définitions multiples des fonctions en C ++, a fourni la syntaxe de la solution et a débogué l'erreur.