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

Что это за стиль синтаксиса в C?

От sys.c строка 123:

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

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

[0 ... __NR_syscalls-1]

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


EDIT:
Я узнал еще один трюк C: #include <asm/unistd.h> будет предварительно обработан и заменен его содержимым и назначен [0 ... _NR_syscalls-1].

4b9b3361

Ответ 1

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

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

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

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

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

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