Dieser Code zeigt eine Warnung: -
Warnung: Die Deklaration deklariert nichts (standardmäßig aktiviert)
Wo der folgende Code keine Warnung anzeigt
%Vor%Warum wird 'Warnung' nur im ersten Code angezeigt?
Der Grund, warum der Compiler die Warnung anzeigt, ist, weil er keinen Namen für die Variable address
anzeigt, die Sie für die emp
struct definiert haben, obwohl Sie deklarieren etwas mit address
in der nächsten Zeile, aber ich denke, der Compiler ist nicht schlau genug, um das herauszufinden.
Wie Sie gezeigt haben, erzeugt dies eine Warnung:
%Vor%Aber nicht das:
%Vor%Oder das:
%Vor% Das struct emp {}
zeigt keine Warnungen an, da sich diese Anweisung nicht in einem Strukturdefinitionsblock befindet. Wenn Sie es in eines dieser Elemente eingefügt haben, zeigt der Compiler ebenfalls eine Warnung an. Im Folgenden werden zwei Warnungen angezeigt:
Die Syntax einer Strukturdefinition lautet:
%Vor%Wenn Sie unmittelbar nach der schließenden geschweiften Klammer eine Kennung hinzufügen, deklarieren Sie eine Variable mit dieser definierten Struktur.
Im ersten Beispiel berücksichtigt der Compiler das address
struct als Mitgliedstyp. es ist wie wenn du schreibst:
Aber im zweiten Beispiel haben Sie den Mitgliedsnamen angegeben:
%Vor%Und hier ist ein Beispiel für die Warnung: Ссылка .
Der Grund, warum die Warnung angezeigt wird, ist, dass der erste Auszug nicht korrekt ist C - er hat eine Constraint-Verletzung, für die ein standardkonformer C-Compiler eine Diagnose-Nachricht erzeugen muss. Es verstößt gegen die C11 6.7.2.1p2 :
Einschränkungen
- Eine struct-declaration , die keine anonyme Struktur oder anonyme Vereinigung deklariert, soll eine struct-declatorator-list enthalten.
Das bedeutet, dass es in Ordnung ist,
zu schreiben %Vor%, da die innere struct
eine anonyme Struktur deklariert, d.h. sie wird nicht benannt.
Aber in Ihrem Beispiel hat die struct address
einen Namen - address
- und daher muss nach der schließenden geschweiften Klammer - Deklaratorliste eine Deklaratorliste haben, die zB a1
ist wie in Ihrer Beispiel oder komplexer foo, *bar, **baz[23][45]
.