Warum es nicht nötig ist, ein „const char *“ mit „extern“ zu ergänzen, wenn es über mehrere Dateien hinweg geteilt wird

StackOverflow https://stackoverflow.com//questions/24043974

  •  21-12-2019
  •  | 
  •  

Frage

Beim Lesen von C++-Büchern habe ich gelernt, dass wir zur gemeinsamen Nutzung einer Konstantenvariablen/eines Konstantenobjekts über mehrere Dateien hinweg die Konstantenvariable einmal in einer der Dateien definieren und sie in jeder Quelldatei deklarieren müssen, in der sie verwendet wird.Zum Beispiel,

In file1.cpp definieren wir global eine const int-Variable wie

extern const int ca = 100;

In file2.cpp, wo wir es verwenden, deklarieren wir diese Variable wie folgt

extern const int ca;

Die obige Konvention macht für mich vollkommen Sinn.Wenn wir jedoch zu einem const char-Zeiger kommen, müssen wir ihn nicht mit extern definieren und er kann sehr gut über mehrere Dateien hinweg gemeinsam genutzt werden.Warum passiert so etwas?Zum Beispiel,

In file1.cpp definieren wir global eine const char-Zeigervariable wie

const char *cstr = "hello";

In file2.cpp, wo wir es verwenden, deklarieren wir diese Variable wie folgt

extern const char *cstr;

Um meine Frage genauer zu formulieren: Warum kann cstr in file2.cpp verwendet werden, obwohl es in file1.cpp nicht mit „extern“ versehen ist?

Vielen Dank

War es hilfreich?

Lösung

Das Problem liegt in der Verknüpfung.Wenn Sie eine Variable im Namespace -Bereich definieren und es keine vorherige Erklärung gibt, die die Verknüpfung festlegt, ist die Verknüpfung extern, wenn das Objekt nicht konstant ist, wenn es sich um intern handelt, wenn dies der Fall ist.Wenn Sie also schreiben:

int const ca = 100;

In einer Quelldatei ist die Verknüpfung intern und die Entität (die Variable) ca bezieht sich auf diese Übersetzungseinheit.Wenn Sie geschrieben hätten:

int ca = 100;

Die Verknüpfung wäre extern, also eine

extern int ca;

in einer anderen Übersetzungseinheit würde sich auf dieselbe Variable beziehen.

Und natürlich, wenn Sie schreiben:

char const* cstr = "hello";

Sie definieren einen Zeiger, der nicht konstant ist (obwohl er auf const verweist).

Natürlich würden Sie normalerweise die Variablen in einem Kopfball deklarieren, mit extern, Es würde also eine frühere Erklärung geben, wenn Sie die Variablen definieren, und es ist die erste Erklärung, die die Verknüpfung festlegt.

Andere Tipps

extern wird verwendet, um es explizit zu machen, dass die Anweisung "Extern const CHAR * CSTR;";ist eine Erklärung und keine Definition, CSTR ist anderswo definiert.Wenn Sie "const char * cstr;" getan habenDer Compiler würde das als Definition interpretieren und mit 2 CSTR-Variablen enden.

Wenn Sie extern auf "const char * cststr=" hello bewerben ";Ich denke, der Compiler ignoriert es, da die Initialisierung bedeutet, dass Sie tatsächlich die Variable definieren.

mehr hier: http://de.wikipedia.org/wiki/external_variable

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