2010-01-11 16 views

Respuesta

15

Este código está inicializando un struct usando la sintaxis de inicializador C funky para inicializar cada campo en orden de declaración, vea http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=421. Un efecto secundario importante en el caso de este ejemplo es que los campos restantes uno no especifica valores para que se inicialice en ceros.

Este truco es relativamente común en las API de Win32: la API requiere que el tamaño se preestablezca como una forma de indicar la versión contra la que se compila el código del cliente; en muchos casos, también se espera que borrar el búfer, que normalmente implicaría una llamada separada a, por ejemplo, memset antes de inicializar el campo de tamaño con sizeof.

Ver también Struct initialization of the C/C++ programming language? de ejemplos relacionados

9

Es una initializer expression que establece el primer campo de W-sizeof(Wininfo) y los otros campos a cero.

+0

+1 (y robó la mayor parte de la respuesta para hacer que la mía sea mucho menos incompleta: P) –

5

En primer lugar, no es una declaración, es una declaración. Las declaraciones no son declaraciones en C.

En segundo lugar, la parte = { /* whatever */ } es un inicializador - especifica el valor inicial de un objeto. Normalmente, utiliza los inicializadores incluidos en {} para inicializar objetos agregados: matrices o estructuras. Sin embargo, una característica poco conocida del lenguaje C es que inicializadores de objetos escalares también pueden estar opcionalmente encerrados en {}, como en

int i = { 5 }; 

¿Qué es exactamente significa que su declaración específica depende de qué tipo es Wininfo. Si W es un agregado, entonces su primer miembro se inicializa con el valor sizeof(Wininfo) y el resto se inicializa con ceros. Si W es un escalar, entonces obtiene el valor inicial de sizeof(Wininfo).

+0

Dado que incluye un inicializador, no es solo una declaración, sino una definición. –

+0

La definición es siempre una declaración. Entonces, en contextos en que la distinción no tiene importancia, el término * declaración * se usa normalmente. El elemento sintáctico siempre se llama * declaration *. Las definiciones solo existen a nivel de semántica. – AnT

+0

+1: Agradable y completo (@nos: esto es lo que estaba pescando al mencionar redundante) –

Cuestiones relacionadas