Що означають квадратні дужки в ініціалізації масиву в C?


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

Що означає [0x3A]тут? Я вивчив лише такі твердженняint a[2] = {1, 2};


Швидше за все це розширення компілятора, яке дозволяє ініціалізувати конкретні записи масиву (за заданими індексами) без заповнення решти.
Олексій Фрунзе,

Відповіді:


81

Це означає ініціалізацію n -го елемента масиву. Наведений вами приклад означатиме, що:

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

Вони називаються "призначеними ініціалізаторами" і насправді є частиною стандарту C99. Однак синтаксис без цього =не є. З цієї сторінки:

Альтернативний синтаксис для цього, який застарів із GCC 2.5, але GCC все ще приймає, - це писати [index]перед значенням елемента, без =.


41

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

Як видно з цього прикладу, він дозволяє ініціалізувати певні елементи масиву, залишаючи інші недоторканими.


15

Це було введено в 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 };

Цікаво, що, хоча посилання зазначає, що =це необхідно, тут, схоже, це не так.


13

Це (близько) синтаксис призначених ініціалізаторів , особливість C99.

В основному, він ініціалізує частини масиву, наприклад;

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

Ініціалізує друге значення масиву до 6, а третє до 3.

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

Версія у вашому коді без, =здається, є специфічним розширенням gcc.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.