2011-03-16 21 views
6

Hago mucha programación Win32 en C++ y muchas estructuras Win32 tienen un miembro 'size' (a menudo llamado cbSize o length) como el primer elemento que debe establecerse antes de la llamada API correspondiente Puede ser hecho. Por ejemplo:Inicializando el primer elemento en una estructura

WINDOWPLACEMENT wp; 
wp.length = sizeof(WINDOWPLACEMENT); 
GetWindowPlacement(hWnd, &wp); 

Ahora, creo que es una buena práctica para inicializar miembros de la estructura a cero, lo que puedo hacer con:

WINDOWPLACEMENT wp = { }; 

o

WINDOWPLACEMENT wp = { 0 }; 

Sin embargo, ¿qué sucede con los otros miembros de la estructura si inicializo el primer miembro como este:

WINDOWPLACEMENT wp = { sizeof(WINDOWPLACEMENT) }; 

¿Se inicializan automáticamente a cero? ¿O depende de qué compilador estoy usando y si es una compilación de depuración o no?

Respuesta

11

Sí, se inicializan automáticamente a cero.

8.5.1/7:

Si hay menos inicializadores en la lista que los que hay miembros en el agregado , a continuación, cada miembro no inicializado explícitamente será valor inicializado (8,5) . [Ejemplo:

struct S { int a; char* b; int c; }; 
S ss = { 1, "asdf" }; 

inicializa ss.a con 1, ss.b con "asdf", y ss.c con el valor de una expresión de la forma int(), es decir , 0.]

+0

+1 para la cotización.Estaba buscando eso, pero lo cité: D – Nawaz

0

Este:

WINDOWPLACEMENT wp = { X }; 

inicializará todos los miembros restantes a 0 (culo uming POD).

Ver: 8.5.1 Agregados [dcl.init.aggr] Párrafo: 7:

7 Si hay menos inicializadores-cláusulas de la lista que los que hay miembros en el agregado, a continuación, cada uno no miembro explícitamente inicializado se inicializará el valor (8.5).

[Ejemplo:

struct S { int a; char* b; int c; }; 
    S ss = { 1, "asdf" }; 

inicializa ss.a con 1, ss.b con "asdf", y ss.c con el valor de una expresión de la forma int(), que es, 0.-ejemplo final]

+1

Claramente, Rob ya lo sabe, y pregunta si 'WINDOWPLACEMENT wp = {sizeof (WINDOWPLACEMENT)};' inicializa los miembros restantes a cero (lo hace). –

1

Si está seguro de que el tamaño es el primer elemento, esto estará bien. Cualquier miembro que no obtenga un valor en el inicializador se pondrá a cero.

Cuestiones relacionadas