static uint8_t togglecode[256] = {
[0x3A] CAPSLOCK,
[0x45] NUMLOCK,
[0x46] SCROLLLOCK
};
Qual é o significado disso [0x3A]
aqui? Eu só aprendi afirmações comoint a[2] = {1, 2};
static uint8_t togglecode[256] = {
[0x3A] CAPSLOCK,
[0x45] NUMLOCK,
[0x46] SCROLLLOCK
};
Qual é o significado disso [0x3A]
aqui? Eu só aprendi afirmações comoint a[2] = {1, 2};
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:
Uma sintaxe alternativa para isso, que está obsoleta desde o GCC 2.5, mas o GCC ainda aceita, é escrever
[index]
antes do valor do elemento, sem=
.
De acordo com os documentos do GCC, isso é compatível com ISO C99. Eles se referem a ele como "Inicializadores designados":
Para especificar um índice de array, escreva `[index] = 'antes do valor do elemento. Por exemplo,
int a[6] = { [4] = 29, [2] = 15 };
é equivalente a
int a[6] = { 0, 0, 15, 0, 29, 0 };
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.
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 a CapsLock
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.
É (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.