Que signifient les crochets lors de l'initialisation d'un tableau en C?

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

Quelle est la signification de [0x3A]ici? J'ai seulement appris des déclarations commeint a[2] = {1, 2};

Akirast
la source
Il s'agit très probablement d'une extension de compilateur qui vous permet d'initialiser des entrées de tableau spécifiques (à des indices donnés) sans remplir le reste.
Alexey Frunze

Réponses:

81

Cela signifie initialiser le n -ième élément du tableau. L'exemple que vous avez donné signifiera que:

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

Ceux-ci sont appelés «initialiseurs désignés» et font en fait partie de la norme C99. Cependant, la syntaxe sans le =n'est pas. À partir de cette page:

Une autre syntaxe pour cela qui est obsolète depuis GCC 2.5 mais que GCC accepte toujours est d'écrire [index]avant la valeur de l'élément, sans =.

huon
la source
41

Selon la documentation du GCC, il est conforme à la norme ISO C99. Ils y font référence sous le nom de «Initialzers désignés»:

Pour spécifier un index de tableau, écrivez `[index] = 'avant la valeur de l'élément. Par exemple,

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

est équivalent à

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

Je n'ai jamais vu cette syntaxe auparavant, mais je l'ai juste compilée avec gcc 4.4.5, avec -Wall. Il a été compilé avec succès et n'a donné aucun avertissement.

Comme vous pouvez le voir dans cet exemple, il vous permet d'initialiser des éléments de tableau spécifiques, en laissant les autres inchangés.

Jonathon Reinhart
la source
15

Cela a été introduit dans C99 et cela s'appelle un initialiseur désigné .

Il vous permet essentiellement de définir des valeurs spécifiques dans un tableau avec le reste par défaut.

Dans ce cas particulier, les index du tableau sont les codes de balayage du clavier. 0x3aest le code de balayage dans l'ensemble n ° 1 (voir section 10.6) pour la CapsLockclé, 0x45est NumLocket 0x46 est ScrollLock.

Sur le premier lien ci-dessus, il indique que:

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

est équivalent à:

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

Fait intéressant, bien que le lien indique que cela =est nécessaire, cela ne semble pas être le cas ici.

paxdiablo
la source
13

C'est (proche de) la syntaxe des initialiseurs désignés , une fonctionnalité C99.

Fondamentalement, il initialise des parties d'un tableau, par exemple;

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

Initialise la deuxième valeur du tableau à 6 et la troisième à 3.

Dans votre cas, les décalages du tableau se trouvent être en hexadécimal (0x3a), ce qui initialise le 58e élément du tableau à la valeur de CAPSLOCK qui est vraisemblablement définie dans le code au-dessus du code que vous affichez.

La version de votre code sans le =semble être une extension spécifique à gcc.

Joachim Isaksson
la source