2010-01-11 5 views

Antwort

15

Dieser Code initialisiert eine struct mit funky C-Initialisierersyntax, um jedes Feld in der Reihenfolge der Deklaration zu initialisieren, siehe http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=421. Ein wichtiger Nebeneffekt im Fall dieses Beispiels ist, dass die verbleibenden Felder keine Werte für die Initialisierung auf Nullen angeben.

Dieser Trick ist ein relativ häufig in Win32-APIs - die API erfordert die Größe voreingestellt, um die Version anzugeben, gegen die der Client-Code kompiliert wird - in vielen dieser Fälle wird auch von einem erwartet Löschen Sie den Puffer, der normalerweise einen separaten Aufruf an z memset vor der Initialisierung der Größe Feld mit der sizeof.

Siehe auch Struct initialization of the C/C++ programming language? für verwandte Beispiele

9

Es ist ein initializer expression ist, dass das erste Feld von W-sizeof(Wininfo) und die anderen Felder auf Null setzt.

+0

+1 (und stahl den größten Teil der Antwort, um mir viel weniger unvollständig zu machen: P) –

5

Erstens ist es keine Aussage, es ist eine Deklaration. Deklarationen sind keine Aussagen in C.

Zweitens ist der = { /* whatever */ } Teil ein Initialisierer - es gibt den Anfangswert eines Objekts an. Normalerweise verwenden Sie Initialisierer, die in {} enthalten sind, um Aggregatobjekte zu initialisieren: Arrays oder Strukturen. Allerdings ein wenig bekanntes Merkmal von C-Sprache ist, dass initializers von skalaren Objekte können optional auch in {} eingeschlossen werden, wie in

int i = { 5 }; 

Was genau Ihre spezifischen Deklaration bedeutet, hängt von Wininfo Typ ist. Wenn W ein Aggregat ist, wird das erste Element mit sizeof(Wininfo) initialisiert und der Rest wird mit Nullen initialisiert. Wenn W ein Skalar ist, erhält es nur den Anfangswert sizeof(Wininfo).

+0

Da es einen Initialisierer enthält, ist es nicht nur eine Deklaration, sondern eine Definition. –

+0

Definition ist immer eine Deklaration. Wenn also die Unterscheidung keine Rolle spielt, wird normalerweise der Begriff * Deklaration * verwendet. Das syntaktische Element wird immer * deklaration * genannt. Definitionen existieren nur auf der Ebene der Semantik. – AnT

+0

+1: Schön und vollständig (@nos: das war es, worüber ich mich bei der Erwähnung von Redundanz lustig machte) –