Что означает [N ... M] в агрегированных инициализаторах 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].

1 101

1 ответ:

Это настройки с помощью Назначенные Инициализаторы.

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

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

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

это не портативный. Компиляция с помощью -pedantic С скажу вам так.

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