Ich lese "Think in C ++" und es wurde gerade die extern
Deklaration eingeführt. Zum Beispiel:
extern int x;
extern float y;
Ich glaube, ich verstehe die Bedeutung (Erklärung ohne Definition), aber ich frage mich, wann sie sich als nützlich erweist.
Kann jemand ein Beispiel geben?
c++
variable-declaration
Aslan986
quelle
quelle
extern
mehrmals eine Definition angeben. Microsoft-Tools haben einen Verknüpfungsfehler für fehlende Symbole erzeugt, wenn die Tabellen in einer anderen Quelldatei nur definiert wurden. Das Problem war, die Tabelle warconst
und der C ++ - Compiler hat siestatic
in der Übersetzungseinheit hochgestuft. Siehe zum Beispielariatab.cpp
undkalynatab.cpp
.Antworten:
Dies ist nützlich, wenn Sie globale Variablen haben. Sie deklarieren das Vorhandensein globaler Variablen in einem Header, sodass jede Quelldatei, die den Header enthält, davon Kenntnis hat. Sie müssen sie jedoch nur einmal in einer Ihrer Quelldateien „definieren“.
Zur Verdeutlichung
extern int x;
teilt using dem Compiler mit, dass irgendwo ein Objekt vom Typint
aufgerufenx
existiert . Es ist nicht die Aufgabe des Compilers, zu wissen, wo es existiert, es muss nur den Typ und den Namen kennen, damit es weiß, wie man es benutzt. Sobald alle Quelldateien kompiliert wurden, löst der Linker alle Verweise auf die eine Definition auf, die er in einer der kompilierten Quelldateien findet. Damit dies funktioniert, muss die Definition der Variablen eine sogenannte "externe Verknüpfung" haben, was im Grunde bedeutet, dass sie außerhalb einer Funktion (in der Regel "Dateibereich") und ohne das Schlüsselwort deklariert werden muss.x
x
static
Header:
Quelle 1:
Quelle 2:
quelle
Dies ist nützlich, wenn Sie eine Variable für einige Module freigeben. Sie definieren es in einem Modul und verwenden extern in den anderen.
Zum Beispiel:
in file1.cpp:
in file2.cpp:
quelle
global_int
sich im globalen Namespace befinden. Wenn ich sie in file2.cpp in einem Namespace-Abschnitt verwenden würde, müsste ich sie korrekt festlegen? dhnamespace XYZ{ void foo(){ ::global_int++ } };
abc.h
, besteht normalerweise eine gute Chance, dass sie in definiert wirdabc.cpp
. Eine gute IDE wird immer helfen, aber gut organisierter Code ist immer eine bessere Lösung.extern
in file2.cpp, kann immer noch aufglobal_int
after include zugreifen . Warum muss ich es haben?Es geht nur um die Verknüpfung .
Die vorherigen Antworten lieferten gute Erklärungen zu
extern
.Aber ich möchte einen wichtigen Punkt hinzufügen.
Sie fragen nach
extern
in C ++ nicht in C , und ich weiß nicht , warum es keine Antwort gibt über den Fall zu erwähnen , wennextern
mit kommtconst
in C ++.In C ++ verfügt eine
const
Variable standardmäßig über eine interne Verknüpfung (nicht wie C).Dieses Szenario führt also zu einem Verknüpfungsfehler :
Quelle 1:
Quelle 2:
Es muss so sein:
Quelle 1:
Quelle 2:
quelle
extern
Definition identisch sind, auch wenn der Compiler keinen Verknüpfungsfehler anzeigt ? Sie können dies tun, indem Sie den Wert vonglobal
in Quelle 2extern
in weggelassenconst int global = 255;
.Dies ist nützlich, wenn Sie eine globale Variable haben möchten. Sie definieren die globalen Variablen in einer Quelldatei und deklarieren sie extern in einer Header-Datei, sodass jede Datei, die diese Header-Datei enthält, dieselbe globale Variable sieht.
quelle