Neudefinition eines Zeigers im globalen Gültigkeitsbereich

8

In diese Frage Ich bin völlig verwirrt über diesen scheinbar grundlegenden Aspekt von C. Betrachten Sie diese zwei Codezeilen:

%Vor%

gcc gibt die folgenden Warnungen aus:

%Vor%

Für welchen Typ ist ptr voreingestellt, int oder int* (wie in ptr ein Zeiger oder int )? Wenn ja, bedeutet das, dass ptr auf Adresse 2 zeigt, oder ist das unverändert? Ich würde annehmen, dass es sich geändert hat, weil es abstürzt, es sei denn, Sie geben ptr eine gültige Adresse an.

%Vor%

Ich bin mir der Möglichkeit eines undefinierten Verhaltens bewusst und dass Sie Warnungen nicht ignorieren sollten, aber ich versuche zu sehen, was hier wirklich passiert.

Informationen zum Kontext finden Sie in der Kommentarkette unter dieser Antwort .

    
Community 16.01.2014, 02:24
quelle

1 Antwort

12

Hier ist Folgendes: Da die zwei Zeilen, die Sie anzeigen, im Dateibereich liegen (im Gegensatz zu einem lokalen Bereich), werden beide Zeilen als Deklarationen behandelt, nicht als Deklaration und als Zuweisungsanweisung. Dies liegt daran, dass im Dateibereich keine Anweisungen vorhanden sein können - nur Deklarationen und Definitionen sind zulässig.

Alte C-Regeln erlaubten Deklarationen vom Typ int , um den Typ ganz wegzulassen. Daher ist die zweite Zeile

  • Eine Deklaration / Definition von ptr
  • ... was ein Zeiger ist, weil er ein Sternchen
  • hat
  • ... und es ist auch ein Zeiger auf int , weil der Typ fehlt.

Diese letzte Regel ist sehr archaisch und wurde in der ANSI-Version des Sprachstandards abgelehnt. Deshalb erhalten Sie eine Warnung. Wenn Sie Ihren Code in

ändern %Vor%

Dein Code wird kompiliert und ausgeführt ( Demo ).

Nun bleibt noch eine Frage: Wie kommt es, dass der Compiler nicht über doppelte Deklarationen klagt? Es stellt sich heraus, dass der Compiler mehrere identische Deklarationen als ein und dasselbe behandelt, solange sie vollständig identisch sind.

    
dasblinkenlight 16.01.2014, 02:36
quelle

Tags und Links