2013-07-11 5 views
25

Es ist üblich, {0} zu verwenden, um eine struct oder zu initialisieren, aber bedenken Sie den Fall, wenn das erste Feld kein Skalartyp ist. Wenn das erste Feld von struct Person ein anderes struct oder Array ist, wird diese Zeile zu einem Fehler führen (error: missing braces around initializer).Ist eine leere Initialisierungsliste ein gültiger C-Code?

struct Person person = {0}; 

Mindestens GCC ermöglicht es mir, eine leere Initialisiererliste zu verwenden, um die gleiche Sache

struct Person person = {}; 

Aber ist der gültige C-Code zu erreichen?

Auch: Ist diese Linie garantiert das gleiche Verhalten, d. H. Eine Null-Initialisierung struct?

struct Person person; 
+10

Wenn Sie nach etwas benig gültiges C fragen, warum wird es als C++ markiert? – PlasmaHH

+0

C sollte die Initialisierung von nichts außer 'statischen' Variablen nicht garantieren, aber ich werde hier in Wikipedia einen einzigen Satz abbrechen. – millimoose

+0

Ich könnte hinzufügen, dass ich meinen Code mit GCC-Optionen pedantisch und Warnungen-als-Fehler gebaut. Andere Compiler oder Konfigurationen erlauben möglicherweise die erste Syntax. –

Antwort

31

Nein, eine leere Initialisierungsliste ist nicht zulässig. Dies kann auch durch GCC angezeigt werden, wenn sie mit -std=c99 -pedantic Kompilieren:

a.c:4: warning: ISO C forbids empty initializer braces 

Der Grund dafür ist die Art und Weise der Grammatik in §6.7.9 der 2011 ISO C Standard definiert:

initializer: 
     assignment-expression 
     { initializer-list } 
     { initializer-list , } 
initializer-list: 
     designation(opt) initializer 
     initializer-list , designation(opt) initializer 

Nach dieser Definition ist ein Initialisierungsliste muss mindestens einen Initialisierer enthalten.

+2

Dies ist die richtige Antwort (dass eine leere Initialisierungsliste durch die Syntax verboten ist). Es ist ein bisschen unglücklich und es wäre schön, wenn die Standards es erlauben würden, aber sie erlauben keine leeren Objekte im Allgemeinen, so dass es nicht benötigt wird. Die Antwort auf den verbleibenden Teil der Frage (erhalten Sie as-wenn-Null, wenn es * no * '= {...}' Teil) ist "ja, wenn das Objekt statische Dauer hat, nein wenn nicht". – torek

+0

Das ist richtig, ich denke, OP hat den '-std = c99' Schalter verpasst. – Gorpik

+1

Das beantwortet meine Frage. Ich habe immer noch keine narrensichere Möglichkeit, die Struktur in einer einzigen Zeile zu initialisieren, wenn ich den Typ des ersten Members nicht kenne (wie es der Fall ist, wenn die Strukturdeklaration automatisch generiert wird), aber das ist eine andere Frage. –

Verwandte Themen