Maison > Article > développement back-end > Pourquoi est-ce que j'obtiens « erreur LNK2005 : déjà définie » dans mon projet C ?
Dévoiler le mystère de l'erreur LNK2005 : comprendre plusieurs définitions
Lorsque vous travaillez avec plusieurs fichiers C au sein d'un projet, l'"erreur LNK2005, déjà "défini" peut être un obstacle déroutant. Cette erreur signifie que plusieurs définitions de la même variable ou fonction existent dans le projet. Pour approfondir ce problème, examinons un exemple spécifique.
Le scénario problématique
Considérons une application console Win32 comprenant deux fichiers : A.cpp et B.cpp. Les deux fichiers contiennent uniquement les éléments suivants :
#include "stdafx.h" int k;
Lors de la compilation, l'erreur survient :
Error 1 error LNK2005: "int k" (?a@@3HA) already defined in A.obj
La racine du problème : violation de la règle d'une définition
Le principe fondamental qui sous-tend cette erreur est la « règle d'une définition » (ODR) appliquée en C . Cette règle stipule que toute variable ou fonction ne peut avoir qu'une seule définition définitive tout au long du projet. Dans ce scénario, A.cpp et B.cpp tentent de définir la même variable « k », violant ainsi l'ODR. En conséquence, l'éditeur de liens rencontre un conflit et déclenche le message d'erreur.
Résoudre le problème
Pour résoudre cette erreur, vous pouvez utiliser deux approches principales :
Approche 1 : Utiliser des espaces de noms sans nom
Si votre intention est de Si vous partagez la même variable sur plusieurs unités de traduction (c'est-à-dire des fichiers cpp), envisagez d'utiliser un espace de noms sans nom. Un espace de noms sans nom encapsule la variable dans sa propre portée, la rendant inaccessible en dehors de cette portée.
namespace { int k; }
Approche 2 : Variables externes
Alternativement, si vous en avez besoin partagez une variable sur plusieurs fichiers mais souhaitez conserver son accessibilité au code externe, utilisez le mot-clé « extern ». Cette approche consiste à déclarer la variable dans un fichier d'en-tête (par exemple, A.h):
extern int k;
et à la définir ensuite dans l'un des fichiers d'implémentation (par exemple, A.cpp):
#include "A.h" int k = 0;
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!