Подтвердить что ты не робот

В C, что означает [foo] = bar?

Я просто читал код в эмуляторе st terminal и наткнулся на этот синтаксис:

static void (*handler[LASTEvent])(XEvent *) = {
    [KeyPress] = kpress,
    [ClientMessage] = cmessage,
    /* Removed some lines for brevity ... */
};

Я никогда не видел этот синтаксис в C, и я даже не уверен, что делать с Google. У меня есть общее представление о том, что он делает (определяя обработчик как массив указателей на функции), но я хотел бы лучше понять этот синтаксис. Он кажется действительным, по крайней мере, на C99, но я ищу еще несколько деталей, почему это правильно, как именно он работает и может быть указателем на стандарт C, где этот синтаксис определен.

4b9b3361

Ответ 1

Это инициализирует массив указателей функций с индексами перечисления. См. здесь.

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

Этот короткий пример должен показать, как его можно использовать.

enum indexes {ZERO, ONE, TWO, FOUR=4};
int array[5] = {[FOUR]=1, [TWO]=9};

for(int i = 0; i < 5; i++)
    printf("%d, ", array[i]);

Отпечатает

0, 0, 9, 0, 1,