Что означают квадратные скобки при инициализации массива в C?



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


что значит [0x3A] здесь? Я только узнал заявления, как int a[2] = {1, 2};

502   4  

4 ответов:

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

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

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

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

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

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

это было введено в C99, и это называется места для инициализации тестов.

это в основном позволяет установить определенные значения в массиве с остальными слева по умолчанию.

в данном конкретном случае, индексы массива скан-кодов клавиатуры. 0x3a - это сканировать код в наборе #1 (см. раздел 10.6) для

это (близко к) синтаксис назначенные инициализаторы, а С99 характеристика.

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

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

инициализирует второе значение массива до 6, а третье до 3.

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

версия в вашем коде без = Кажется, это расширение для gcc.

Comments

    Ничего не найдено.