Deklaration deklariert nichts: Warnung?

9
%Vor%

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?

    
kevin gomes 06.02.2014, 18:06
quelle

3 Antworten

8

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:

%Vor%     
juan.facorro 06.02.2014, 18:27
quelle
3

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:

%Vor%

Aber im zweiten Beispiel haben Sie den Mitgliedsnamen angegeben:

%Vor%

Und hier ist ein Beispiel für die Warnung: Ссылка .

    
rullof 06.02.2014 18:53
quelle
1

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

     
  1. Eine struct-declaration , die keine anonyme Struktur oder anonyme Vereinigung deklariert, soll eine struct-declatorator-list enthalten.
  2.   

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] .

    
Antti Haapala 18.03.2018 23:28
quelle

Tags und Links