Struktur definieren, die Global in c++
es war ein etwas Ausführlicher thread (228684) auf, wie Sie auch Global (mit extern struct) deklarieren Sie eine Struktur, die gesehen werden könnte, in mehr als 1 c++ - Datei, aber ich kann nicht herausfinden, wie genau es zu tun (es gab eine Menge Diskussionen darüber, Tue dies, Tue das, vielleicht tun Sie dies, versuchen Sie diese, etc...).
couuld jemand bitte post ein sehr einfaches Beispiel, wie deklarieren Sie eine Struktur, die gesehen werden könnte, in 2 separaten c++ - Dateien? Wenn ich alle meine Funktionen in der gleichen Datei wie die main funktioniert es einwandfrei, aber wenn ich versuche, die Aufteilung der Funktionen in verschiedene Dateien, ich kann es nicht kompilieren.
Dinge, die ich bin unklar, auf...
Sollte ich Typdefinition der Struktur?
Definiere ich die Struktur in eine header-Datei aufnehmen und diesen header in jedem c++ - source-Datei?
Muss ich die #ifndef makro in der header-Datei?
Ich erkläre die Struktur extern im header?
InformationsquelleAutor | 2008-11-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es als header-Datei.
in Ihrem header-Datei (nennen wir es foo.h)
Dann in alle C-Dateien, die Sie haben
Für C++, es ist mehr common/preferred-Klasse, aber Sie verwenden können, struct als gut. Das extern-Schlüsselwort bezieht sich im Allgemeinen auf Variablen, nicht auf Klasse/Struktur-Deklarationen. Sie würde eine Globale variable extern in einer header-Datei (dann erkläre es nicht-extern) in ein von Ihr .cpp-Dateien.
Ich habe es codiert ein bit von C nur zu vertraut mit Zeigern und so, so kann ich getrost sagen, dass meine Unwissenheit auf C++ ist absolute. Jedoch, was schon immer nervte mich ist: hätte so hart, dass der compiler überprüfen, ob eine Datei bereits enthalten sind, und in diesem Fall, vermeide Sie es wieder?
Compiler werden versuchen, dies zu tun. Hast du gehört, der
#pragma once
? Siehe stackoverflow.com/a/34884735 für die Schwierigkeit.InformationsquelleAutor David Nehme
Strukturen lassen sich nicht extern oder static. Wenn Sie möchten, um eine Struktur, die in mehr als zwei übersetzungseinheiten, setzen die Struktur-definition in einem header:
foo.hpp
Dann, dass die header-Datei, in der alle Quell Dateien verwenden, struct. Mit einem struct/class/union definiert in mehrere source-files ist vollkommen gültig, solange jeder ist gleich definiert. Sie können eine Include-Guard um die definition von
foo
zu verhindern, dass die foo enthalten ist, zweimal in den gleichen Quellcode-Dateien kompiliert werden. (So, dass mehrerefoo
im gleichen Programm gültig ist, aber nachdem mehrerefoo
in der gleichen Quelle (Anmerkung: gemeint ist der übersetzungseinheit) ist nicht gültig.) Sehen 3.2 Eine Definition Regel in der C++ - Standard oder ein Entwurf.Wenn Sie dies sehen:
Nicht die
foo
ist extern, aber dieb
(das Objekt) ist extern! Es besagt, dass dasb
ist nicht definiert, sondern nur deklariert, so können Sie sich beziehen.InformationsquelleAutor Johannes Schaub - litb
Wenn Sie möchten, eine Globale variable; ein einzelnes struct-Zugriff von mehreren compilation-units (C++ - Dateien):
--
--
--
"Struct {}" line-in "foo".h sagt dem compiler, welchen struct foo aussieht. Die "extern struct" - Zeile deklariert eine Besondere struct foo genannt "globalFoo" mit externer Verlinkung. (Es ist möglich, kombinieren Sie diese beiden Erklärungen, siehe @litb ' s Antwort.) Was dies bedeutet ist, dass die Nutzer von globalFoo (bar1/test1 und bar2/test2) sieht für die Struktur anderswo, werden Sie nicht haben Ihre eigenen Kopien.
foo.cpp ist der Besondere Fall, der definiert, globalFoo. Es kann nur eine definition von Variablen, und in diesem Fall foo.cpp hat globalFoo definition. Wenn bar1 und bar2 suchen globalFoo "extern" finden Sie foo.cpp's globalFoo. Die Namen beziehen sich auf den gleichen tatsächlichen Struktur in allen drei Dateien.
Wenn die
extern
vorher nicht dort gewesen, dann alle drei .cpp-Dateien hätten eine Linie, die Lesen, "struct foo globalFoo;" (denken Sie Daran, #include ist nur copy/paste) , würde [versuchen zu] erstellen Sie drei verschiedene Strukturen mit dem gleichen Namen, was für ein Durcheinander.Hinweis: Die "
extern struct foo globalFoo;
"- Zeile ist redundant in foo.cpp's Fall, aber das spielt keine Rolle.struct foo
stattfoo
?InformationsquelleAutor aib
Hier ein kleines Beispiel:
Klasse
my_class
wird sichtbar in jeder Datei, die diese header. Ich denke, es ist etwas anderes, obwohl Ihre Frage, aber ich weiß nicht Recht sehen, was.bzzzt. Das ist nur für Bezeichner im globalen Namensraum. Diese Makros erscheinen nicht in den analysierten Quellen, und somit nicht den globalen Namensraum verschmutzen.
Es könnte sein, ein Bezeichner in den globalen namespace mit dem Namen my_header definiert durch den compiler.
Nein. Sie sind nicht nur für Bezeichner im globalen Namensraum. Sie können verwendet werden, als ein Schlagwort oder ein spezielles token, oder wie immer Sie wollen.
InformationsquelleAutor Ben Collins