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