Warum gibt die Initialisierung einer externen Variablen innerhalb einer Funktion einen Fehler?
Dieser code kompiliert fein:
extern int i = 10;
void test()
{
std::cout << "Hi" << i << std::endl;
}
Während dieser gibt einen Fehler:
void test()
{
extern int i = 10;
std::cout << "Hi" << i << std::endl;
}
Fehler: "i" hat sowohl "extern" und Initialisierer
Lese ich in C++ Primer
Jede Erklärung, die einen expliziten Initialisierer ist eine definition.
Wir bieten eine Initialisierung auf eine definierte variable als extern deklariert, aber
dabei überschreibt die extern. Eine extern, ein-Initialisierer ist ein
definition. Es ist ein Fehler, um eine Initialisierung auf eine extern-innen ein
Funktion.
Kann jemand eine Erklärung warum sollte das ein Fehler sein wenn man es lokal in einer Funktion, während die gleiche ist erlaubt, in einem globalen Rahmen?
InformationsquelleAutor der Frage Amit Tomar | 2013-06-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Grund, definieren Sie eine externe variable innerhalb einer Funktion nicht sinnvoll ist folgende:
Wenn Sie erklären, ein symbol extern, weisen Sie den compiler an, alle solche Vorkommnisse dieser Wert in der gleichen symbol. Alle vorkommen von extern int i; in Ihr Programm würde den link auf die extern definierte ich. Schauen Sie auf dieses Beispiel:
Diesem Beispiel sollte die Ausgabe hi11. Allerdings, wenn wir entfernen Sie die extern-innen Haupt -, es werden Ausgabe-10. Denn ohne extern, habe ich nicht, die Verknüpfung zu der globalen ich, aber schaffen es eigene lokale Kopie, die ich habe.
Dem Grund, dass die Definition einer extern ich innerhalb einer Funktion nicht sinnvoll ist, ist was, wenn wir uns erlaubt, eine beliebige Funktion zu "definieren", ich. Welche Funktion wird zuerst ausgeführt? Wann wird es definiert?
Angenommen, das folgende Beispiel ist gültig, was würde der Ausgang sein???
Sollte der output von test2 0 oder 1000? Schauen Sie auch bei meinen "test3", wir sind hier kurz und prägnant zu sagen, den link meine ich, die extern definierte ich, und weisen Sie ihm den Wert 1000. Dies ist sehr Verschieden von dem Versuch, um "initialize" einen Wert ein.
In kurz -, extern-Variablen wirklich nur dann Sinn machen, als globals und definiert werden sollte, im globalen Bereich. In Ihren Beispielen ist die erste version nicht kompilieren für mich. Ich finde das interessant. Es könnte sein, lohnt ein Blick auf die standards docs, um zu sehen, wenn diese definiert ist kurz und prägnant, oder wenn Ihr compiler könnte der Umgang mit diesem in einer Weise entwickelt, um zusätzlichen Schutz...
InformationsquelleAutor der Antwort ChrisCM
Durch das hinzufügen einer initialiser der Erklärung, es wird zu einer definition der globalen Variablen. Es entspricht der gleichen definition, ohne
extern
das ist das, was dein Buch meint, wenn er sagt, es "überschreibt die von extern".Zwar können Globale Variablen deklariert werden (mit
extern
) innerhalb einer Funktion, Sie kann nicht definiert werden, gibt es nur im namespace-Gültigkeitsbereich. Das ist, warum der zweite Code ist ein Fehler.Wenn Sie wissen wollen, warum die Entwickler von C (Woher diese Regeln kamen zu C++) für Deklarationen, aber keine Definitionen hier, dann fürchte ich, ich weiß nicht, die Sprache, die Geschichte detailliert zu beantworten.
InformationsquelleAutor der Antwort Mike Seymour
Zuerst solltest du vertraut mit der Konzeption von Verknüpfungen und die Bedeutung der extern-Verknüpfung:
Die Funktion der
static
die unterscheiden sich vonextern
,extern
ist nur eine Anfragestatic
ist ein Befehl.Daher in block-Geltungsbereich die nachstehenden Vorgehensweise ist empfohlen zu tun:
Für die Globale extern-Deklaration ist möglicherweise zu konvertieren form
zu
InformationsquelleAutor der Antwort yuan
Der einfachste Weg, es zu setzen:
Den Zweck der
extern
keyword ist, um ein Objekt zu deklarieren, ohne es zu definieren. Durch Definition, sind Sie im Grunde sagen, der compiler "nicht zuordnen einen Wert, aber einen Wert zuweisen". Das macht keinen Sinn - Es sollte nie getan werden, innerhalb oder außerhalb einer Funktion. Die meisten Compiler wird entweder warnen Sie und fahren Sie trotzdem, oder Sie wird nicht compiler und geben einen Fehler aus.Obwohl es über den Rahmen dieser Frage näher zu erläutern was
extern
tut, Sie finden es vielleicht nützlich, die Antworten zu Lesen für diese Frage.InformationsquelleAutor der Antwort Super Cat
extern
Variablen initialisiert werden, bevor irgendeine Funktion ausgeführt wird:en.cppreference.com/w/cpp/language/initialization#Non-local_variables
Wenn es erklärt wurde
static
eher alsextern
in einem Funktionsblock, es würde immer noch statische Speicher Daueraber seine' Verknüpfung wäre lokalen Funktion vs. externe. Es wäre also initialisiert, wenn die Ausführung verläuft zunächst durch, dass die Zeile innerhalb der Funktion:en.cppreference.com/w/cpp/language/storage_duration#Static_local_variables
So, es ist ok zu initialisieren
static
Variablen in einer Funktion, die blockieren, aber nicht ok zu initialisierenextern
Variablen gibt.InformationsquelleAutor der Antwort Don Slowik