Umfang eines Variablen- und Funktionsnamens

8

Das ist mein Code:

%Vor%

Und der Fehler, den ich bekomme, ist:

%Vor%     
Koray Tugay 10.06.2015, 07:35
quelle

6 Antworten

11

Wenn Sie zwei separate Identifikatoren desselben Namens für verschiedene Entitäten im selben Namensraum definieren, können sie sich überlappen. C11 standard, Kapitel §6.2.1 besagt,

  

Wenn eine Kennung zwei verschiedene Entitäten mit demselben Namen bezeichnet   Raum, die Bereiche möglicherweise überlappen ....

Siehe Fußnote: Warum in diesem Szenario beide sum s im selben Namensraum sind

Sobald Sie den Bezeichner mit einem anderen Typ neu definiert haben,

  

.... Wenn dies der Fall ist, wird der Bereich einer Entität (der innere Bereich ) enden   strikt vor dem Geltungsbereich der anderen Entität (der äußere Bereich ). Innerhalb des inneren Bereichs bezeichnet der Bezeichner die im inneren Bereich deklarierte Entität. Die im äußeren Bereich deklarierte Entität ist innerhalb des inneren Bereichs versteckt (und nicht sichtbar).

Das heißt, in Ihrem Fall innerhalb der Funktion sum() , wenn Sie int sum definieren, überschatten Sie im Prinzip die Funktion sum . Nach der Neudefinition ist sum ein Bezeichner vom Typ int in diesem Funktionsumfang . Daher können Sie innerhalb der Funktion sum() keinen Aufruf an sum() machen, da dies jetzt ein int -Typ ist.

Allerdings sollte FWIW, der Aufruf von sum() in main() (bzw. außerhalb von sum() selbst) gültig sein, da zu diesem Zeitpunkt int sum den Gültigkeitsbereich nicht überschreitet.

Lösung: Ändern Sie den Variablennamen int sum in etwas anderes.

Danke an @pmg für die Korrektur

BEARBEITEN:

Wie bereits erwähnt in der anderen Antwort von @juanchopanza , nachdem der Shadowing Variablenname geändert wurde Ihr Programm wird kompiliert und sobald Sie es ausführen, stehen Sie unendliche Rekursion aufgrund des bedingten Aufrufs an sum() in sum() selbst. Sie müssen eine Bedingung break hinzufügen, um die Rekursion zu beenden ( return from).

Fußnote:

Mit Bezug auf C11 , Kapitel §6.2.3 , Namensräume können wir sagen, dass es separate Namensräume für verschiedene Kategorien von Kennungen, z 1) Markennamen 2) die Tags von Strukturen, Vereinigungen und Aufzählungen, 3) die Mitglieder von Strukturen oder Gewerkschaften und 4) alle anderen Identifikatoren.

In diesem speziellen Fall befinden sich die Funktionen sum() und int sum im selben Namensraum für den Funktionsbereich sum()

    
Sourav Ghosh 10.06.2015, 07:40
quelle
12

Sie haben die Bedeutung von sum hier geändert:

%Vor%

Ab jetzt ist sum in dem Bereich, in dem es deklariert wurde, ein int , und das wird zu Unsinn:

%Vor%

Tu das nicht und dein Code wird kompiliert. Nach dem Kompilieren können Sie sich sorgen, dass Sie die Rekursion stoppen.

    
juanchopanza 10.06.2015 07:38
quelle
6

Der Umfang ist wichtig

  1. Der Funktionsname sum hat hier einen globalen Gültigkeitsbereich.
  2. Die Variable sum ist lokal und hat einen lokalen Gültigkeitsbereich.

  3. Der Konflikt liegt darin, dass Sie in sum() sum() aufrufen. Jetzt innerhalb der Funktion sum() haben Sie 2 Objekte gleichen Namens und unterschiedlichen Typs, daher der Fehler.

Wenn du etwas wie

hättest %Vor%

Dann wäre dein Code in Ordnung gewesen. Da die Variable sum lokal für die Funktion sum() ist und sie das einzige Objekt in der Funktion sum() mit diesem Namen ist.

Anstatt sich darum zu sorgen, sollten Sie die Variable besser umbenennen und sicherstellen, dass der Name und der Name der Variablen unterschiedlich sind

    
Gopi 10.06.2015 07:41
quelle
4

Sie müssen int sum = 0 in int y = 0 ändern, außerdem bricht Ihr Programm ab, wenn Sie die Rekursion bei sum(x,sum)

nicht stoppen     
Iwan1993 10.06.2015 07:40
quelle
2

Ändern Sie einfach den Namen der Variablen sum innerhalb der Funktion sum zu total

%Vor%     
Anant Kolvankar 10.06.2015 07:43
quelle
1

Variable und Funktion haben den gleichen Namen, weshalb es die Funktion und die Variable gleichzeitig referenziert, was die Fehlerursache ist

    
Rahul Verma 10.06.2015 11:15
quelle

Tags und Links