¿Qué significan los corchetes en la inicialización de una matriz en C?

85
static uint8_t togglecode[256] = {
    [0x3A] CAPSLOCK,
    [0x45] NUMLOCK,
    [0x46] SCROLLLOCK
};

¿Cuál es el significado de [0x3A]aquí? Solo he aprendido declaraciones comoint a[2] = {1, 2};

Akirast
fuente
Lo más probable es que sea una extensión del compilador que le permite inicializar entradas de matriz específicas (en índices dados) sin completar el resto.
Alexey Frunze

Respuestas:

81

Significa inicializar el n -ésimo elemento de la matriz. El ejemplo que ha dado significará que:

togglecode[0x3A] == CAPSLOCK
togglecode[0x45] == NUMLOCK
togglecode[0x46] == SCROLLLOCK

Estos se denominan "inicializadores designados" y en realidad forman parte del estándar C99. Sin embargo, la sintaxis sin =no es. De esa página:

Una sintaxis alternativa para esto que ha sido obsoleta desde GCC 2.5 pero GCC aún acepta es escribir [index]antes del valor del elemento, sin =.

huon
fuente
41

Según los documentos de GCC, esto es compatible con ISO C99. Se refieren a él como "Inicializadores designados":

Para especificar un índice de matriz, escriba `[índice] = 'antes del valor del elemento. Por ejemplo,

 int a[6] = { [4] = 29, [2] = 15 };

es equivalente a

 int a[6] = { 0, 0, 15, 0, 29, 0 };

Nunca había visto esta sintaxis antes, pero la compilé con gcc 4.4.5, con -Wall. Se compiló con éxito y no dio advertencias.

Como puede ver en ese ejemplo, le permite inicializar elementos de matriz específicos, dejando los demás intactos.

Jonathon Reinhart
fuente
15

Eso se introdujo en C99 y se llama inicializador designado .

Básicamente, le permite establecer valores específicos en una matriz y dejar el resto como valores predeterminados.

En este caso particular, los índices de la matriz son los códigos de exploración del teclado. 0x3aes el código de escaneo en el conjunto # 1 (ver sección 10.6) para la CapsLockclave, 0x45es NumLocky 0x46 es ScrollLock.

En el primer enlace de arriba, dice que:

int a[6] = { [4] = 29, [2] = 15 };

es equivalente a:

int a[6] = { 0, 0, 15, 0, 29, 0 };

Curiosamente, aunque el enlace indica que =es necesario, ese no parece ser el caso aquí.

paxdiablo
fuente
13

Es (cercano a) la sintaxis de los inicializadores designados , una característica de C99.

Básicamente, inicializa partes de una matriz, por ejemplo;

int aa[4] = { [2] = 3, [1] = 6 };

Inicializa el segundo valor de la matriz a 6 y el tercero a 3.

En su caso, las compensaciones de la matriz están en hexadecimal (0x3a), lo que inicializa el elemento 58 de la matriz al valor de CAPSLOCK, que presumiblemente se define en el código sobre el código que está mostrando.

La versión en su código sin =parece ser una extensión específica de gcc.

Joachim Isaksson
fuente