C++-Fehler: Schwerwiegender Fehler LNK1169: Ein oder mehrere mehrfach definierte Symbole gefunden

I. Übersicht

  Wenn Sie Visual Studio zum Schreiben von C++-Code verwenden, ist es zum Schreiben von Spezifikationen und Standards häufig erforderlich, mehrere Quelldateien und Header-Dateien zu erstellen (und die Quelldateien müssen relevante Header-Dateien enthalten). Dies trainiert nicht nur Ihr modulares Denken, Aber es ermöglicht auch eine rechtzeitige Positionierung. Welches Modul hat den Fehler verursacht? Aber es gibt Vor- und Nachteile. Denken Sie darüber nach, C/C++ sind beide kompilierte Sprachen, daher müssen kompilierte Sprachen Folgendes durchlaufen: Vorverarbeitung, Kompilierung, Assemblierung und Verknüpfung Stufen?

 Hier finden Sie eine kurze Einführung in die in den einzelnen Phasen geleistete Arbeit:

(1) Vorverarbeitung:
Fügen Sie den gesamten Inhalt der Header-Datei (.h) zur Quelldatei (.cpp) hinzu.
Bedingte Kompilierung (#ifdef...#define...#endif usw.)
Makroersetzung (#define num 100: num durch 100 ersetzen)
Löschen Sie die Kommentare in der Datei
(2) Kompilieren Sie
und prüfen Sie, ob der Quellcode den C++-Syntaxspezifikationen entspricht (wir definieren illegale Bezeichner, die häufig zur Kompilierungszeit ermittelt werden)
Übersetzen Sie den Code in der Quelle Datei in Assemblersprache
(3) Assemblieren Sie
die Assemblersprache in Maschinensprache (Binärsprache)
(4) Link
zum Generieren einer ausführbaren Datei

 Nachdem Sie nun die obige Arbeit verstanden haben, schauen wir uns den folgenden Code an:
(1)student.h:
int a;
.....//可以放其他代码的声明
(2)student.cpp:
#include "student.h"
(3)teacher.h:
(4)teacher.cpp:
#include"student.h"
#include "teacher.h"
(5)main.cpp:
#include "student.h"
#include "teacher.h"
以上代码我稍微解释一下:
	就是在main.cpp中包含了teacher.h和student.h,而teacher.cpp中又包含了student.h,我们只在student.h中定义了一个全局变量int a。现在的情况相当于是student.h被包含了两次,也就是全局变量a被重复定义了两次。
注意:
	一般我们把函数的声明或变量的定义放置在.h文件中

Die Fehlermeldung lautet wie folgt:

Fügen Sie hier eine Bildbeschreibung ein
Erklären Sie die Fehlermeldung: Variable a wird mehrfach definiert (Hinweis: Die Variable ist in der Header-Datei definiert).

1. Wenn mehrere Dateien enthalten sind, werden Variablen wiederholt definiert.

(1) Die Ursache des Problems
  liegt darin, dass das C++-Programm beim Kompilieren den Inhalt der Quelldatei (.cpp) kompiliert und da die Quelldatei (.cpp) auch den Inhalt der Headerdatei (. h), Daher werden Variablen wiederholt definiert. Wenn Sie es nicht verstehen, können Sie die Erklärung in Klammern lesen (Hinweis: Es gibt eine Definition der Variablen a in student.h, dann ist student.h in teacher.cpp enthalten , und schließlich in main. cpp enthält student.h und teacher.h)
Fügen Sie hier eine Bildbeschreibung ein
(2) Um das Problem zu lösen
  , nehmen Sie den Code am Anfang des Artikels als Beispiel. Der gelöste Code lautet wie folgt:

第一种解决办法:
(1)student.h:
extern int a;
.....//可以放其他代码的声明
(2)student.cpp:
int a;
#include "student.h"
(3)teacher.h:

(4)teacher.cpp:
#include"student.h"
#include "teacher.h"
(5)main.cpp:
#include "student.h"
#include "teacher.h"

第二种解决办法:
(1)student.h:
static int a;
.....//可以放其他代码的声明
(2)student.cpp:
#include "student.h"
(3)teacher.h:
(4)teacher.cpp:
#include"student.h"
#include "teacher.h"
(5)main.cpp:
#include "student.h"
#include "teacher.h"

Hinweis:
Die erste Lösung:
  Definieren Sie die Variable in der Quelldatei (.cpp) und führen Sie sie mit dem Schlüsselwort „extern“ in die Header-Datei (.h) ein. Zu diesem Zeitpunkt erkennt der Compiler, dass sich die Variable in cpp befindet. Variablen, keine Variablen in .h.

Die zweite Lösung:
  Fügen Sie weiterhin die Definition der Variablen in die Header-Datei (.h) ein, aber die Variable wird mit „statisch“ geändert. Die Funktion des Hinzufügens von statisch besteht darin, die Rolle der Variablen einzuschränken Variable. Die Domäne ist nur in dieser Datei gültig und in anderen Dateien ungültig.

Die dritte Lösung:
  Verwenden Sie Inline, um das Problem zu lösen.
Die vierte Lösung:
  Verwenden Sie die Force/Force-Methode. Diese Methode kann in der in Visual Studio integrierten Entwicklung gelöst werden Umgebung. , kann die Kompilierung erfolgreich sein, der Compiler gibt jedoch weiterhin eine Warnung aus.

2. Bedingte Kompilierung: #ifndef…#define…#endif

  Viele Blogs im Internet sagen, dass die bedingte Kompilierung verwendet werden kann, um das Problem der wiederholten Definition von Variablen in mehreren Dateien zu lösen. Einige Schüler haben den Dateien eine bedingte Kompilierung hinzugefügt, aber die wiederholten Definitionen wurden nach dem Ausführen des Programms nicht gelöst. Hier muss der Blogger etwas sagen: Zunächst einmal ist die Idee, die bedingte Kompilierung zu verwenden, richtig und verdient Anerkennung. Warum? Da die bedingte Kompilierung das Problem der wiederholten Einbindung von Header-Dateien lösen kann (z. B. weiter oben im Artikel: teacher.cpp enthält student.h und main.cpp enthält teacher, h und tstudent.h), heißt das nicht, dass student .h ist enthalten (doppelte Einbindung zweimal). Es ist zu beachten, dass die bedingte Kompilierung zwar das Problem der wiederholten Einbindung von Header-Dateien in der Kompilierungsphase lösen kann (was der Lösung des Problems doppelter Definitionen von Variablen entspricht), während der Kompilierung jedoch nicht passieren kann Verknüpfen, da in der Verknüpfungsphase sichergestellt werden muss, dass die definierten globalen Variablen nur eine Kopie im gesamten Programm haben. Daher kann die bedingte Kompilierung das Problem immer noch nicht lösen

Supongo que te gusta

Origin blog.csdn.net/Mr_zhang1911116/article/details/126241815
Recomendado
Clasificación