static uint8_t togglecode[256] = {
[0x3A] CAPSLOCK,
[0x45] NUMLOCK,
[0x46] SCROLLLOCK
};
Що означає [0x3A]
тут? Я вивчив лише такі твердженняint a[2] = {1, 2};
static uint8_t togglecode[256] = {
[0x3A] CAPSLOCK,
[0x45] NUMLOCK,
[0x46] SCROLLLOCK
};
Що означає [0x3A]
тут? Я вивчив лише такі твердженняint a[2] = {1, 2};
Відповіді:
Це означає ініціалізацію n -го елемента масиву. Наведений вами приклад означатиме, що:
togglecode[0x3A] == CAPSLOCK
togglecode[0x45] == NUMLOCK
togglecode[0x46] == SCROLLLOCK
Вони називаються "призначеними ініціалізаторами" і насправді є частиною стандарту C99. Однак синтаксис без цього =
не є. З цієї сторінки:
Альтернативний синтаксис для цього, який застарів із GCC 2.5, але GCC все ще приймає, - це писати
[index]
перед значенням елемента, без=
.
Згідно з документами GCC, це відповідає ISO C99. Вони називають це "призначеними ініціаторами":
Щоб вказати індекс масиву, напишіть `[index] = 'перед значенням елемента. Наприклад,
int a[6] = { [4] = 29, [2] = 15 };
еквівалентно
int a[6] = { 0, 0, 15, 0, 29, 0 };
Я ніколи раніше не бачив цього синтаксису, але я просто скомпілював його за допомогою gcc 4.4.5 з -Wall. Він складений успішно і не дав жодних попереджень.
Як видно з цього прикладу, він дозволяє ініціалізувати певні елементи масиву, залишаючи інші недоторканими.
Це було введено в C99, і воно називається призначеним ініціатором .
Це в основному дозволяє встановити конкретні значення в масиві, а решта залишити за замовчуванням.
У цьому конкретному випадку індекси масивів є кодами сканування клавіатури. 0x3a
- це код сканування в наборі №1 (див. розділ 10.6) для CapsLock
ключа, 0x45
є NumLock
і 0x46 є ScrollLock
.
На першому посиланні вище йдеться, що:
int a[6] = { [4] = 29, [2] = 15 };
еквівалентно:
int a[6] = { 0, 0, 15, 0, 29, 0 };
Цікаво, що, хоча посилання зазначає, що =
це необхідно, тут, схоже, це не так.
Це (близько) синтаксис призначених ініціалізаторів , особливість C99.
В основному, він ініціалізує частини масиву, наприклад;
int aa[4] = { [2] = 3, [1] = 6 };
Ініціалізує друге значення масиву до 6, а третє до 3.
У вашому випадку зміщення масиву трапляється у шістнадцятковому (0x3a), що ініціалізує 58-й елемент масиву значенням CAPSLOCK, яке, імовірно, визначається в коді над кодом, який ви показуєте.
Версія у вашому коді без, =
здається, є специфічним розширенням gcc.