Das ist mein Code:
%Vor%Und der Fehler, den ich bekomme, ist:
%Vor% 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()
Sie haben die Bedeutung von sum
hier geändert:
Ab jetzt ist sum
in dem Bereich, in dem es deklariert wurde, ein int
, und das wird zu Unsinn:
Tu das nicht und dein Code wird kompiliert. Nach dem Kompilieren können Sie sich sorgen, dass Sie die Rekursion stoppen.
Der Umfang ist wichtig
sum
hat hier einen globalen Gültigkeitsbereich. Die Variable sum
ist lokal und hat einen lokalen Gültigkeitsbereich.
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
Ändern Sie einfach den Namen der Variablen sum innerhalb der Funktion sum zu total
%Vor%Variable und Funktion haben den gleichen Namen, weshalb es die Funktion und die Variable gleichzeitig referenziert, was die Fehlerursache ist