Вопрос по linux, c, kernel – Что означает [N… M] в агрегатных инициализаторах C?

101

От 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]

Что...?

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

Ваш Ответ

1   ответ
91

Назначенные инициализаторы.

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

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

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

Это не портативно. Компиляция с-pedantic с тобой.

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

Кажется, это не портативно. Это есть? Ivaylo Strandjev
@ Mehrdad Соответствует ли компилятор Microsoft c стандарту C99? Я здесь отдыхаю ... C99 Aftnix
@ Mehrdad: На самом деле, только конструкция на основе диапазона назначенных инициализаторов является расширением gcc. Сами назначенные инициализаторы разрешены стандартом Alok Save
@ Mehrdad: Извините, я не хочу быть частью каких-либо пламенных приманок, я намеревался только прояснить тонкую деталь, которую, как мне показалось, вы неправильно поняли. Alok Save
@ Mehrdad: Для ясности, конструкция диапазона переносима только на gcc (и компиляторы, которые реализуют его расширения), а назначенные инициализаторы в целом переносимы только на компиляторы, которые поддерживают C99 (или, по крайней мере, эту конкретную функцию). Keith Thompson

Похожие вопросы