Warum funktionieren mehrere Deklarationen in C für eine globale Variable, aber nicht für eine lokale Variable?

7

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).

link1 link2

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%     
Rüppell's Vulture 31.03.2013, 21:24
quelle

3 Antworten

17

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.

    
maditya 31.03.2013, 21:34
quelle
5

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 .

    
dasblinkenlight 31.03.2013 21:34
quelle
3

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%     
teppic 31.03.2013 21:57
quelle

Tags und Links