Что означает [N… M] в агрегатных инициализаторах C?

101

Из строки 123 sys.c :

void *sys_call_table[__NR_syscalls] = 
{
    [0 ... __NR_syscalls-1] = sys_ni_syscall,
#include <asm/unistd.h>
};

sys_call_tableэто общий указатель на массивы, я это вижу. Однако какие обозначения:

[0 ... __NR_syscalls-1]

Что такое ...?


РЕДАКТИРОВАТЬ: здесь
я узнал еще один трюк на C: #include <asm/unistd.h>будет предварительно обработан, заменен его содержимым и назначен [0 ... _NR_syscalls-1].

Амуму
источник
2
Нет, это не указатель на массив, это массив указателей. Будет объявлен указатель на массивvoid (*sys_call_table)[__NR_syscalls]
Патрик Шлютер
@tristopia ты прав. Я имел в виду указатель на массивы, аналогичный char *argv[]. Исправлена.
Amumu

Ответы:

90

Это инициализация с использованием назначенных инициализаторов .

Инициализация на основе диапазона - это расширение gnu gcc.

Чтобы инициализировать диапазон элементов одним и тем же значением, напишите [first ... last] = value. Это расширение GNU. Например,

 int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };

Он не переносится. Компиляция с -pedanticпомощью говорит вам об этом.

Как это здесь работает?
Препроцессор заменяет #include <asm/unistd.h>его фактическим содержимым ( он определяет разные символьные константы и типы и объявляет разные функции ) в конструкции на основе диапазона, которая затем используется для инициализации массива указателей.

Алок Сохранить
источник
Кажется, это не переносно. Есть?
Ивайло Странджев
5
@Mehrdad соответствует ли компилятор microsoft c стандарту c99? Я
остаюсь
3
@Mehrdad: На самом деле, только конструкция назначенных инициализаторов на основе диапазона является расширением gcc. Сами назначенные инициализаторы разрешены стандартом C.
Alok Save
2
@ Mehrdad: Извините, я не хочу участвовать в каких-либо приманках, я хотел только прояснить тонкую деталь, которую, как я думал, вы неправильно поняли.
Alok Save
2
@Mehrdad: Для ясности, конструкция диапазона переносится только на gcc (и компиляторы, реализующие ее расширения), а назначенные инициализаторы в целом переносятся только на компиляторы, поддерживающие C99 (или, по крайней мере, эту конкретную функцию).
Кейт Томпсон