¿Qué significa {0} al inicializar un objeto?

¿Qué significa {0} al inicializar un objeto?


Cuando {0} se utiliza para inicializar un objeto, ¿qué significa? No puedo encontrar ninguna referencia a {0} en cualquier lugar, y debido a las llaves, las búsquedas en Google no son útiles.


Código de ejemplo:


SHELLEXECUTEINFO sexi = {0}; // what does this do?
sexi.cbSize = sizeof(SHELLEXECUTEINFO);
sexi.hwnd = NULL;
sexi.fMask = SEE_MASK_NOCLOSEPROCESS;
sexi.lpFile = lpFile.c_str();
sexi.lpParameters = args;
sexi.nShow = nShow;
if(ShellExecuteEx(&sexi))
{
DWORD wait = WaitForSingleObject(sexi.hProcess, INFINITE);
if(wait == WAIT_OBJECT_0)
GetExitCodeProcess(sexi.hProcess, &returnCode);
}

Sin él, el código anterior fallará en el tiempo de ejecución.


Respuestas:


Lo que está sucediendo aquí se llama agregado inicialización Aquí está la definición (abreviada) de un agregado de la sección 8.5.1 de la especificación ISO:



Ahora, usando {0} inicializar un agregado como este es básicamente un truco para 0 todo el asunto Esto se debe a que al usar la inicialización agregada no es necesario especificar todos los miembros y la especificación requiere que todos los miembros no especificados se inicialicen de forma predeterminada, lo que significa que se establezcan en 0 para tipos simples.


Aquí está la cita relevante de la especificación:



Puede encontrar la especificación completa sobre este tema aquí


Algunas respuestas de código


struct ring_buffer {
unsigned char buffer[SERIAL_BUFFER_SIZE];
volatile unsigned int head;
volatile unsigned int tail;
};
ring_buffer rx_buffer = { { 0 }, 0, 0 };
ring_buffer rx_buffer = {0};
struct ring_buffer {    unsigned char buffer[SERIAL_BUFFER_SIZE];
volatile unsigned int head;
volatile unsigned int tail;
};
ring_buffer rx_buffer = { { 0 }, 1, 2 };