Basicamente, ele permite que você defina valores específicos em uma matriz com o resto deixado como padrão.
Nesse caso específico, os índices de matriz são os códigos de varredura do teclado. 0x3aé o código de varredura no conjunto # 1 (consulte a seção 10.6) para a CapsLockchave, 0x45é NumLocke 0x46 é ScrollLock.
No primeiro link acima, ele afirma que:
int a[6] = { [4] = 29, [2] = 15 };
é equivalente a:
int a[6] = { 0, 0, 15, 0, 29, 0 };
Curiosamente, embora o link indique que =é necessário, não parece ser o caso aqui.
Basicamente, ele inicializa partes de um array, por exemplo;
int aa[4] = { [2] = 3, [1] = 6 };
Inicializa o segundo valor da matriz para 6 e o terceiro para 3.
No seu caso, os deslocamentos do array estão em hexadecimal (0x3a), o que inicializa o 58º elemento do array com o valor CAPSLOCK, que presumivelmente está definido no código acima do código que você está mostrando.
A versão em seu código sem o =parece ser uma extensão específica do gcc.
Respostas:
Significa inicializar o n elemento -ésimo da matriz. O exemplo que você deu significa que:
togglecode[0x3A] == CAPSLOCK togglecode[0x45] == NUMLOCK togglecode[0x46] == SCROLLLOCK
Eles são chamados de "inicializadores designados" e, na verdade, fazem parte do padrão C99. No entanto, a sintaxe sem o
=
não é. A partir dessa página:fonte
De acordo com os documentos do GCC, isso é compatível com ISO C99. Eles se referem a ele como "Inicializadores designados":
Nunca vi essa sintaxe antes, mas apenas a compilei com o gcc 4.4.5, com -Wall. Compilou com sucesso e não deu avisos.
Como você pode ver nesse exemplo, ele permite inicializar elementos específicos do array, deixando os outros intocados.
fonte
Isso foi introduzido no C99 e é chamado de inicializador designado .
Basicamente, ele permite que você defina valores específicos em uma matriz com o resto deixado como padrão.
Nesse caso específico, os índices de matriz são os códigos de varredura do teclado.
0x3a
é o código de varredura no conjunto # 1 (consulte a seção 10.6) para aCapsLock
chave,0x45
éNumLock
e 0x46 éScrollLock
.No primeiro link acima, ele afirma que:
int a[6] = { [4] = 29, [2] = 15 };
é equivalente a:
int a[6] = { 0, 0, 15, 0, 29, 0 };
Curiosamente, embora o link indique que
=
é necessário, não parece ser o caso aqui.fonte
É (perto de) a sintaxe dos inicializadores designados , um recurso C99.
Basicamente, ele inicializa partes de um array, por exemplo;
int aa[4] = { [2] = 3, [1] = 6 };
Inicializa o segundo valor da matriz para 6 e o terceiro para 3.
No seu caso, os deslocamentos do array estão em hexadecimal (0x3a), o que inicializa o 58º elemento do array com o valor CAPSLOCK, que presumivelmente está definido no código acima do código que você está mostrando.
A versão em seu código sem o
=
parece ser uma extensão específica do gcc.fonte