2012-03-24 13 views
79
static uint8_t togglecode[256] = { 
    [0x3A] CAPSLOCK, 
    [0x45] NUMLOCK, 
    [0x46] SCROLLLOCK 
}; 

Qual è il significato di [0x3A] qui? Ho solo appreso dichiarazioni come int a[2] = {1, 2};Cosa significano le parentesi quadre nell'inizializzazione dell'array in C?

+0

Molto probabilmente è un'estensione del compilatore che consente di inizializzare specifiche voci di array (a determinati indici) senza riempire il resto. –

risposta

77

Significa inizializzare l'elemento n -th dell'array.L'esempio che hai dato significa che:

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

Questi sono chiamati "designated initializers", e sono in realtà parte dello standard C99. Tuttavia, la sintassi senza = non lo è. Da quella pagina:

Una sintassi alternativa per questo che è stato obsoleto dal GCC 2.5, ma GCC accetta ancora è quello di scrivere [index] prima del valore elemento, senza =.

15

Che è stato introdotto in C99 e si chiama designated initialiser.

Fondamentalmente consente di impostare valori specifici in un array con il resto a sinistra come valori predefiniti.

In questo caso particolare, gli indici di array sono i codici di scansione della tastiera. 0x3a è scan code in set #1 (vedere la sezione 10.6) per la chiave CapsLock, 0x45 è NumLock e 0x46 è ScrollLock.

Al primo link qui sopra, essa afferma che:

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

è equivalente a:

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

È interessante notare che, anche se il legame si afferma che = è necessario, che non sembra sii il caso qui.

39

Secondo lo standard GCC docs questo è conforme ISO C99. Si riferiscono ad esso come "Initializer designati":

Per specificare un indice di matrice, scrivere `[indice] = '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 ho appena compilato con gcc 4.4.5, con -Wall. Ha compilato con successo e non ha dato alcun avvertimento.

Come si può vedere da questo esempio, consente di inizializzare elementi di array specifici, lasciando intatti gli altri.

13

È (vicino a) la sintassi di designated initializers, una funzionalità C99.

Fondamentalmente, inizializza parti di un array, ad esempio;

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

Intializes il secondo valore della matrice 6, e il terzo a 3.

Nel suo caso gli offset di matrice capita di essere in esadecimale (0x3a) che inizializza l'elemento 58'th del array al valore di CAPSLOCK che è presumibilmente definito nel codice sopra il codice che stai visualizzando.

La versione del codice senza il = sembra essere un'estensione specifica di gcc.

Problemi correlati