От 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
Инициализация выполняется с помощью назначенных инициализаторов.
Инициализация на основе диапазона - расширение gnu gcc.
Чтобы инициализировать диапазон элементов для одного и того же значения, напишите [first ... last] = value
. Это расширение GNU. Например,
int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
Не переносится. Компиляция с помощью -pedantic
с сообщением об этом.
Как это работает?
Препроцессор заменяет #include <asm/unistd.h>
своим фактическим содержимым (он определяет разные символические константы и типы и объявляет разные функции) в конструкции на основе диапазона, которые затем используются далее для инициализации массива указателей.