Im folgenden Code, warum mehrere Deklarationen (und eine Definition) für eine globale Variable "x" funktioniert gut, aber das gleiche funktioniert nicht für eine lokale Variable "y", die innerhalb der main () -Funktion ist? zeigt die folgenden 2 Fehler:
1) Neudeklaration von 'y' ohne Bindung
2) vorherige Deklaration von 'y' war hier
Warum zeigt es Fehler für die lokale Variable, aber nicht globale Variable? Nicht nur mein Buch, sondern die folgenden 2 Links aus diesem Forum geben eindeutig an, dass wir eine Variable mehrfach deklarieren können (obwohl nur einmal definiert).
Und bitte seien Sie vorsichtig, um zu erklären, was der "ohne Verknüpfung" Teil des ersten Fehlers "Redewendung von 'y' ohne Verbindung" bedeutet? Welche Verbindung und zu wem? Wo würde eine lokale Variable verknüpft sein?
%Vor% In C und C ++ ist int y;
innerhalb einer Funktion sowohl eine Deklaration als auch eine Definition.
In C ist int x;
im Dateibereich (außerhalb jeder Funktion) eine Deklaration und eine vorläufige Definition . Mehrere vorläufige Definitionen sind erlaubt; Nur eine Definition ist erlaubt.
Dies ist die im C99-Standard, Abschnitt 6.2.2, Teil 2, definierte Methode:
In der Menge der Übersetzungseinheiten und Bibliotheken, die jeweils ein ganzes Programm bilden Deklaration eines bestimmten Identifikators mit externer Verknüpfung bezeichnet das gleiche Objekt oder Funktion. Innerhalb einer Übersetzungseinheit jede Deklaration eines Identifikators mit internem Verknüpfung bezeichnet dasselbe Objekt oder dieselbe Funktion. Jede Deklaration eines Identifikators mit Nr Verknüpfung bezeichnet eine eindeutige Entität.
Die "globalen" Variablen x
haben eine externe Verknüpfung, also bezeichnen sie dasselbe Objekt. Die lokalen Variablen y
haben dagegen keine Verknüpfung, es gibt also eine Kollision.
Referenzen: C99 Standard .
Bei externen Variablen ist jede Deklaration, die keine Initialisierung ist, eine vorläufige Definition. Diese erstellen selbst keinen Speicher, daher sind mehrere zulässig. Also nehmen Sie Ihr Beispiel:
%Vor%Wenn am Ende der Datei nur vorläufige Definitionen vorhanden waren, wird die Variable einmal definiert und auf 0 gesetzt.
Dies bedeutet, dass wenn Sie eine Verknüpfung zu einer anderen Datei herstellen, die ebenfalls eine provisorische Definition von x
hat, wird ein Fehler gemäß dem Standard angezeigt. Die meisten Compiler / Linker haben dies jedoch immer erlaubt und sind im Standard als Erweiterung definiert.
Bei lokalen Variablen ist jede Deklaration eine Definition aufgrund von Bereichsregeln. Dies ist jedoch erlaubt:
%Vor%Tags und Links c