Frage

Meine sehr grundlegende Kenntnisse der C und Kompilationsprozess hat in letzter Zeit gegangen rostig. Ich habe versucht, Antwort auf die folgende Frage, um herauszufinden, aber ich konnte nicht Kompilierung, Link- und Vorverarbeitungsphase Grundlagen verbinden. Eine schnelle Suche im Google nicht viel weiterhelfen. Also entschied ich mich auf die ultimative Quelle des Wissens zu kommen :)

Ich weiß: Variablen sollten nicht in den H-Dateien definiert werden. Es ist ok, sie dort zu erklären.

. Da könnte eine Header-Datei von mehreren Stellen enthalten bekommen, so dass die Variable mehr als einmal neu zu definieren (Linker gibt den Fehler)

Mögliche Behelfslösung:. Mit Kopfschutz in Header-Dateien und definieren Variable, dass

Ist es wirklich eine Lösung: Nein, denn Kopfschutz für Vorlaufphase ist. Das ist Compiler zu sagen, dass dieser Teil bereits aufgenommen wurde, und beinhaltet nicht es noch einmal. Aber unsere mehrere Definitionsfehler kommen im Linker Teil -. Viel nach der Erstellung

Die ganze Sache hat mich verwirrt darüber, wie Vorverarbeitung und die Verknüpfung der Arbeit. Ich dachte, dass die Vorverarbeitung wird nicht nur den Code, wenn der Header Guard Symbol definiert wurde. In diesem Fall sollte nicht mehrere Definition eines Variablen Problem auch gelöst werden?

Was passiert, dass diese Vorverarbeitung Richtlinien den Übersetzungsvorgang aus Neudefinition Symbolen unter Kopfschutz sparen, aber der Linker wird noch mehrere Definitionen des Symbols?

War es hilfreich?

Lösung

Kopfschutz schützt Sie aus mehreren Einschlüssen in einer einzigen Quelldatei, nicht aus mehreren Quelldateien. Ich denke, Ihr Problem ergibt sich aus nicht, dieses Konzept zu verstehen.

Es ist nicht, dass Pre-Prozessor Wache während der Kompilierung von diesem Problem sparen. Eigentlich während der Kompilierung, eine einzige Quelle-Datei in ein obj kompiliert wird, Symboldefinitionen werden nicht aufgelöst. Aber im Fall der Verknüpfung, wenn der Linker versucht, das Symbol definitons zu lösen, wird es mehr als eine Definition verwirrt sieht es Flag casuing die Fehler.

Andere Tipps

Eine Sache, die ich in der Vergangenheit verwendet haben (wenn globale Variablen in Mode waren):

var.h-Datei:

...
#ifdef DEFINE_GLOBALS
#define EXTERN
#else
#define EXTERN extern
#endif
EXTERN int global1;
EXTERN int global2;
...

Dann in eine C-Datei (in der Regel eines, die main ()):

#define DEFINE_GLOBALS
#include "var.h"

Der Rest der Quelldateien enthält nur "var.h" normal.

Beachten Sie, dass DEFINE_GLOBALS ist kein Kopf Wache, sondern erlaubt erklärt / Festlegung der Variablen abhängig davon, ob sie definiert ist. Diese Technik erlaubt eine Kopie der Erklärungen / Definitionen.

Sie haben zwei .c-Dateien. Sie bekommen zusammengestellt getrennt . Jedes verfügt über eine Headerdatei. Einmal. Jeder bekommt eine Definition. Sie Konflikt stehen zur Verknüpfungszeit.

Die konventionelle Lösung ist:

#ifdef DEFINE_SOMETHING
int something = 0;
#endif

Dann sind Sie #DEFINE DEFINE_SOMETHING in nur ein C-Datei.

Kopfschutz eine Header-Datei zu stoppen ist enthalten mehrere Male in derselben Übersetzungseinheit (das heißt in der gleichen .c Quelldatei). Sie haben keine Auswirkung, wenn Sie die Datei in zwei oder mehr Übersetzungseinheiten umfassen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top