Das Geheimnis des Fehlers LNK2005 enthüllen: Mehrere Definitionen verstehen
Beim Arbeiten mit mehreren C-Dateien innerhalb eines Projekts wird der „Fehler LNK2005“ bereits angezeigt „Definiert“-Nachricht kann ein verwirrendes Hindernis sein. Dieser Fehler bedeutet, dass im Projekt mehrere Definitionen derselben Variablen oder Funktion vorhanden sind. Um dieses Problem genauer zu untersuchen, betrachten wir ein konkretes Beispiel.
Das problematische Szenario
Stellen Sie sich eine Win32-Konsolenanwendung vor, die aus zwei Dateien besteht: A.cpp und B.cpp. Beide Dateien enthalten nur Folgendes:
#include "stdafx.h" int k;
Beim Kompilieren tritt der Fehler auf:
Error 1 error LNK2005: "int k" (?a@@3HA) already defined in A.obj
Die Wurzel des Problems: Verstoß gegen die One-Definition-Regel
Das diesem Fehler zugrunde liegende Grundprinzip ist die in C durchgesetzte „One Definition Rule“ (ODR). Diese Regel schreibt vor, dass jede Variable oder Funktion im gesamten Projekt nur eine definitive Definition haben darf. In diesem Szenario versuchen sowohl A.cpp als auch B.cpp, dieselbe Variable „k“ zu definieren, was gegen die ODR verstößt. Infolgedessen stößt der Linker auf einen Konflikt und löst die Fehlermeldung aus.
Behebung des Problems
Um diesen Fehler zu beheben, können Sie zwei Hauptansätze anwenden:
Ansatz 1: Nutzung namenloser Namespaces
Wenn Sie dies beabsichtigen Wenn Sie dieselbe Variable über mehrere Übersetzungseinheiten hinweg (z. B. CPP-Dateien) gemeinsam nutzen, sollten Sie die Verwendung eines namenlosen Namespace in Betracht ziehen. Ein namenloser Namespace kapselt die Variable in ihrem eigenen Bereich und macht sie außerhalb dieses Bereichs unzugänglich.
namespace { int k; }
Ansatz 2: Externe Variablen
Alternativ, wenn nötig Wenn Sie eine Variable über mehrere Dateien hinweg gemeinsam nutzen, aber ihre Zugänglichkeit für externen Code beibehalten möchten, verwenden Sie das Schlüsselwort „extern“. Bei diesem Ansatz wird die Variable in einer Header-Datei (z. B. A.h):
extern int k;
deklariert und anschließend in einer der Implementierungsdateien (z. B. A.cpp) definiert:
#include "A.h" int k = 0;
Das obige ist der detaillierte Inhalt vonWarum erhalte ich in meinem C-Projekt den Fehler „Fehler LNK2005: bereits definiert'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!