Ответ 1
Вы нашли пример назначенных инициализаторов. C99 и C11 не подходят к вашему примеру, но у них есть довольно гибкая поддержка такого поведения. Ваш конкретный пример (с помощью ...
) является расширением GCC. По ссылке:
Чтобы инициализировать диапазон элементов для одного и того же значения, напишите
[first ... last] = value
. Это расширение GNU. Например,int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
Итак, это означает, что ваш пример создает массив размером MAX_DEVICES
и инициализирует каждый элемент в этом массиве до -1
.
Для справки единственным стандартным поведением является назначение определенных индексов, а не диапазонов:
[постоянное выражение] = значение инициализатора
В моей копии спецификации есть более сложный пример:
int a[MAX] = {
1, 3, 5, 7, 9, [MAX-5] = 8, 6, 4, 2, 0
};
Инициализирует первые пять и последние пять элементов массива для явных значений. Средние значения (если они есть) будут 0
.