Скорее всего, это расширение компилятора, которое позволяет вам инициализировать определенные записи массива (по заданным индексам) без заполнения остальных.
Алексей Фрунзе
Ответы:
81
Это означает инициализировать n-й элемент массива. Приведенный вами пример будет означать, что:
Согласно документам 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. Он успешно компилировался и не выдавал никаких предупреждений.
Как видно из этого примера, он позволяет инициализировать определенные элементы массива, оставляя другие нетронутыми.
Это в основном позволяет вам устанавливать определенные значения в массиве, а остальные оставлять по умолчанию.
В этом конкретном случае индексы массива являются кодами сканирования клавиатуры. 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 };
Интересно, что хотя в ссылке указано, что =это необходимо, здесь, похоже, это не так.
По сути, он инициализирует, например, части массива;
int aa[4] = { [2] = 3, [1] = 6 };
Инициализирует второе значение массива до 6, а третье - до 3.
В вашем случае смещения массива указаны в шестнадцатеричном формате (0x3a), который инициализирует 58-й элемент массива значением CAPSLOCK, которое предположительно определено в коде над кодом, который вы показываете.
Версия в вашем коде без =расширения кажется специфическим для gcc.
Ответы:
Это означает инициализировать n-й элемент массива. Приведенный вами пример будет означать, что:
togglecode[0x3A] == CAPSLOCK togglecode[0x45] == NUMLOCK togglecode[0x46] == SCROLLLOCK
Они называются «назначенными инициализаторами» и фактически являются частью стандарта C99. Однако синтаксис без символа
=
- нет. С этой страницы:источник
Согласно документам GCC, это соответствует ISO C99. Они называют это «назначенными инициаторами»:
Я никогда раньше не видел этого синтаксиса, но я просто скомпилировал его с помощью 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.источник