static uint8_t togglecode[256] = {
[0x3A] CAPSLOCK,
[0x45] NUMLOCK,
[0x46] SCROLLLOCK
};
В чем смысл [0x3A]
? Я только выучил заявления, подобные int a[2] = {1, 2};
Что означают квадратные скобки в инициализации массива в C?
static uint8_t togglecode[256] = {
[0x3A] CAPSLOCK,
[0x45] NUMLOCK,
[0x46] SCROLLLOCK
};
В чем смысл [0x3A]
? Я только выучил заявления, подобные int a[2] = {1, 2};
Что означают квадратные скобки в инициализации массива в C?
Это означает инициализировать n -й элемент массива.Пример вы дали будет означать, что:
togglecode[0x3A] == CAPSLOCK
togglecode[0x45] == NUMLOCK
togglecode[0x46] == SCROLLLOCK
Они называются "designated initializers", и на самом деле являются частью стандарта C99. Однако синтаксис без =
не является. С этой страницы:
Альтернативный синтаксис для этого, который был устаревшим, так как GCC 2.5, но до сих пор GCC принимает, чтобы написать
[index]
перед значением элемента, без=
.
Это было введено в C99, и оно называется designated initialiser.
В основном это позволяет вам устанавливать определенные значения в массиве, а остальные останутся как значения по умолчанию.
В этом конкретном случае индексом массива являются коды сканирования клавиатуры. 0x3a
- scan code in set #1 (см. Раздел 10.6) для ключа CapsLock
, 0x45
- NumLock
и 0x46 - ScrollLock
.
На первой ссылке выше, в нем говорится, что:
int a[6] = { [4] = 29, [2] = 15 };
эквивалентно:
int a[6] = { 0, 0, 15, 0, 29, 0 };
достаточно интересно, хотя ссылка утверждает, что =
необходимо, что не представляется в данном случае.
В соответствии с GCC docs это соответствует требованиям ISO C99. Они относятся к нему как «Назначенные зажигалки»:
Чтобы указать индекс массива, напишите `[index] = 'перед значением элемента. Например,
int a[6] = { [4] = 29, [2] = 15 };
эквивалентно
int a[6] = { 0, 0, 15, 0, 29, 0 };
Я никогда не видел этот синтаксис раньше, но я просто скомпилировал с GCC 4.4.5, с -Wall. Он скомпилирован успешно и не дал никаких предупреждений.
Как вы можете видеть из этого примера, он позволяет инициализировать определенные элементы массива, оставив остальных нетронутыми.
Это (близко к) синтаксис designated initializers, функция C99.
В принципе, он инициализирует части массива, например;
int aa[4] = { [2] = 3, [1] = 6 };
Intializes второе значение массива до 6, а третий 3.
В вашем случае смещения массива случается в шестнадцатеричном (0x3a), который инициализирует 58'th элемент из массив к значению CAPSLOCK, который предположительно определен в коде выше кода, который вы показываете.
Версия в вашем коде без =
, по-видимому, является расширением gcc.
Скорее всего это расширение компилятора, которое позволяет инициализировать определенные записи массива (по заданным индексам) без заполнения остальных. –