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

В чем смысл [0x3A]? Я только выучил заявления, подобные int a[2] = {1, 2};Что означают квадратные скобки в инициализации массива в C?

+0

Скорее всего это расширение компилятора, которое позволяет инициализировать определенные записи массива (по заданным индексам) без заполнения остальных. –

ответ

77

Это означает инициализировать n -й элемент массива.Пример вы дали будет означать, что:

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

Они называются "designated initializers", и на самом деле являются частью стандарта C99. Однако синтаксис без = не является. С этой страницы:

Альтернативный синтаксис для этого, который был устаревшим, так как GCC 2.5, но до сих пор GCC принимает, чтобы написать [index] перед значением элемента, без =.

15

Это было введено в 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 }; 

достаточно интересно, хотя ссылка утверждает, что = необходимо, что не представляется в данном случае.

39

В соответствии с 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. Он скомпилирован успешно и не дал никаких предупреждений.

Как вы можете видеть из этого примера, он позволяет инициализировать определенные элементы массива, оставив остальных нетронутыми.

13

Это (близко к) синтаксис designated initializers, функция C99.

В принципе, он инициализирует части массива, например;

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

Intializes второе значение массива до 6, а третий 3.

В вашем случае смещения массива случается в шестнадцатеричном (0x3a), который инициализирует 58'th элемент из массив к значению CAPSLOCK, который предположительно определен в коде выше кода, который вы показываете.

Версия в вашем коде без =, по-видимому, является расширением gcc.

Смежные вопросы