Puntos suspensivos en la inicialización de matriz en el módulo de kernel C

Puntos suspensivos en la inicialización de matriz en el módulo de kernel C


Estaba examinando un código en github https://github.com/umlaeute/v4l2loopback/blob/master/v4l2loopback.c y encontré esta línea, que me desconcierta. ¿Es esta una característica increíblemente genial de macro o gcc del kernel que no conozco? ¿Qué hace el = -1 hacer?


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.)");

La línea en cuestión es la primera, las dos siguientes dadas por contexto (esto es crear un parámetro especificable por línea de cmd usando una macro del kernel http://lxr.free-electrons.com/source/include/linux/moduleparam.h#L103 )


De todos modos, ¿qué está pasando con la inicialización de la matriz? ¿Cómo funciona esa sintaxis?


Respuestas:


Ha encontrado un ejemplo de inicializadores designados. C99 y C11 no van tan lejos como su ejemplo, pero tienen un soporte bastante flexible para este tipo de comportamiento. Su ejemplo específico (usando el ... ) es una extensión GCC. Desde el enlace:



Eso significa que su ejemplo está creando una matriz de tamaño MAX_DEVICES e inicializando cada elemento en esa matriz a -1 .


Como referencia, el único comportamiento admitido por el estándar es asignar índices específicos, en lugar de rangos:



Hay un ejemplo más complicado en mi copia de la especificación:


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

Lo que inicializa los primeros cinco y los últimos cinco elementos de la matriz en valores explícitos. Los valores medios (si los hay) serían 0 .