static uint8_t togglecode[256] = {
[0x3A] CAPSLOCK,
[0x45] NUMLOCK,
[0x46] SCROLLLOCK
};
Qual è il significato di [0x3A]qui? Ho solo imparato affermazioni comeint a[2] = {1, 2};
static uint8_t togglecode[256] = {
[0x3A] CAPSLOCK,
[0x45] NUMLOCK,
[0x46] SCROLLLOCK
};
Qual è il significato di [0x3A]qui? Ho solo imparato affermazioni comeint a[2] = {1, 2};
Risposte:
Significa inizializzare l' n -esimo elemento dell'array. L'esempio che hai fornito significherà che:
togglecode[0x3A] == CAPSLOCK
togglecode[0x45] == NUMLOCK
togglecode[0x46] == SCROLLLOCK
Questi sono chiamati "inizializzatori designati" e in realtà fanno parte dello standard C99. Tuttavia, la sintassi senza non lo =è. Da quella pagina:
Una sintassi alternativa per questo che è stata obsoleta da GCC 2.5 ma GCC accetta ancora è quella di scrivere
[index]prima del valore dell'elemento, con no=.
Secondo i documenti di GCC questo è conforme a ISO C99. Lo chiamano "Designated Initialzers":
Per specificare un indice di matrice, scrivi "[index] =" prima del valore dell'elemento. Per esempio,
int a[6] = { [4] = 29, [2] = 15 };è equivalente a
int a[6] = { 0, 0, 15, 0, 29, 0 };
Non ho mai visto questa sintassi prima, ma l'ho appena compilata con gcc 4.4.5, con -Wall. È stato compilato correttamente e non ha fornito avvisi.
Come puoi vedere da quell'esempio, ti consente di inizializzare specifici elementi dell'array, lasciando gli altri intatti.
È stato introdotto nel C99 e si chiama inizializzatore designato .
Fondamentalmente ti consente di impostare valori specifici in un array con il resto lasciato come predefinito.
In questo caso particolare, gli indici dell'array sono i codici di scansione della tastiera. 0x3aè il codice di scansione nel set # 1 (vedere la sezione 10.6) per la CapsLockchiave, 0x45è NumLocke 0x46 è ScrollLock.
Sul primo collegamento sopra, si afferma che:
int a[6] = { [4] = 29, [2] = 15 };
è equivalente a:
int a[6] = { 0, 0, 15, 0, 29, 0 };
È interessante notare che, sebbene il collegamento indichi che =è necessario, non sembra essere il caso qui.
È (vicino a) la sintassi degli inizializzatori designati , una funzionalità C99.
Fondamentalmente, inizializza parti di un array, per esempio;
int aa[4] = { [2] = 3, [1] = 6 };
Inizializza il secondo valore della matrice su 6 e il terzo su 3.
Nel tuo caso, gli offset dell'array sono in esadecimale (0x3a) che inizializza il 58 ° elemento dell'array al valore di CAPSLOCK che presumibilmente è definito nel codice sopra il codice che stai mostrando.
La versione nel codice senza =sembra essere un'estensione specifica di gcc.