Эллипсис в инициализации массива в модуле ядра C - программирование
Подтвердить что ты не робот

Эллипсис в инициализации массива в модуле ядра C

Я изучал некоторый код в github https://github.com/umlaeute/v4l2loopback/blob/master/v4l2loopback.c и наткнулся на эту строку, что меня озадачило. Это какой-то невероятно классный макрос ядра или функция gcc, о которых я не знаю? Что делает = -1?

static int video_nr[MAX_DEVICES] = { [0 ... (MAX_DEVICES-1)] = -1 };
module_param_array(video_nr, int, NULL, 0444);
MODULE_PARM_DESC(video_nr, "video device numbers (-1=auto, 0=/dev/video0, etc.)");

Линия, о которой идет речь, является первой, следующие две для контекста (это создает параметр cmdline-specificable с использованием макроса ядра http://lxr.free-electrons.com/source/include/linux/moduleparam.h#L103)

В любом случае, что происходит с инициализацией массива? Как работает этот синтаксис?

4b9b3361

Ответ 1

Вы нашли пример назначенных инициализаторов. C99 и C11 не подходят к вашему примеру, но у них есть довольно гибкая поддержка такого поведения. Ваш конкретный пример (с помощью ...) является расширением GCC. По ссылке:

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

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

Итак, это означает, что ваш пример создает массив размером MAX_DEVICES и инициализирует каждый элемент в этом массиве до -1.

Для справки единственным стандартным поведением является назначение определенных индексов, а не диапазонов:

[постоянное выражение] = значение инициализатора

В моей копии спецификации есть более сложный пример:

int a[MAX] = {
            1, 3, 5, 7, 9, [MAX-5] = 8, 6, 4, 2, 0
};

Инициализирует первые пять и последние пять элементов массива для явных значений. Средние значения (если они есть) будут 0.