C ++: Verwirrende Deklarationssemantik

8

Nachdem ich mich an Perl und ein bisschen C versucht habe, versuche ich C ++ zu lernen und schon bin ich festgefahren von den Details und Fallstricken. Bedenken Sie Folgendes: -

%Vor%

Huh, warum der Unterschied?

Zur Klärung : Die Verwendung desselben Namens ist in einem Fall gültig und in einem anderen ungültig.

    
deepmax 02.09.2009, 07:26
quelle

2 Antworten

14

Willkommen im Universum von C ++! Für Ihre Frage liegt die Antwort in einem Konzept namens "Point-of-Declaration".

%Vor%

Aus Abschnitt: -3.3.1.1 (C ++ Standardentwurf) Der Deklarationspunkt für einen Namen ist unmittelbar nach seinem vollständigen Deklarator und vor seinem Initialisierer (falls vorhanden), außer wie unten angegeben.

%Vor%

Hier; der 'operator =' ist der Initialisierer. Sie können sagen, dass der Punkt der Deklaration für 'x' noch nicht erreicht ist, also ist der Wert von 'x' unbestimmt.

%Vor%

Warum? Aus Abschnitt: -3.3.1.4 (C ++ Standardentwurf) Ein nichtlokaler Name bleibt bis zur Deklaration des lokalen Namens, der ihn versteckt, sichtbar. Hier ist der Punkt der Deklaration bei ';' Charakter. Daher wird der früher sichtbare Wert von 'arr' verwendet, d. H. = 3.

Vielleicht möchten Sie auch wissen, dass Folgendes gilt: -

%Vor%

Aus Abschnitt: -Kapitel-3.3.1.4 (C ++ Standardentwurf): - Der Deklarationspunkt für einen Enumerator befindet sich unmittelbar nach seiner Enumeratordefinition.

Aber tu das nicht

%Vor%

Warum? Weil Enumeratoren in den umschließenden Bereich der Enumeration exportiert werden. Im obigen Beispiel sind die Enumeratoren Spades, Clubs, Hearts und Diamonds deklariert. Da die Enumeratoren in den umschließenden Bereich exportiert werden, gelten sie als globaler Bereich. Die Bezeichner im Beispiel sind bereits im globalen Gültigkeitsbereich definiert. Es ist also ein Fehler.

Weitere Details und Fallstricke (:-)) finden Sie in Abschnitt 3.3 "Deklarative Regionen und Bereiche" des Entwurfs C ++ - Standard. Wenn Sie interessiert sind, können Sie die PDF-Datei von hier ( Ссылка ).

    
Abhay 02.09.2009, 07:29
quelle
7

Erstens, in der realen Welt sollten Sie weder verwenden, weil es verwirrend ist, und selbst ein paar Sekunden, um diesen feinen Punkt zu verstehen, ist zu viel Verschwendung.

Scrap den Rest meiner Antwort - Abhay hat es schon richtig gemacht, und viel detaillierter:)

    
MaxVT 02.09.2009 07:37
quelle

Tags und Links