Ellissi nell'inizializzazione dell'array nel modulo del kernel C

Ellissi nell'inizializzazione dell'array nel modulo del kernel C


Stavo esaminando del codice su github https://github.com/umlaeute/v4l2loopback/blob/master/v4l2loopback.c e mi sono imbattuto in questa riga, che mi sconcerta. Si tratta di una macro del kernel o di una funzionalità gcc incredibilmente interessante di cui non sono a conoscenza? Cosa significa il = -1 fare?


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 riga in questione è la prima, le due successive fornite per il contesto (questo sta creando un parametro specificabile da cmdline utilizzando una macro del kernel http://lxr.free-electrons.com/source/include/linux/moduleparam.h#L103 )


Ad ogni modo, cosa sta succedendo con l'inizializzazione dell'array? Come funziona questa sintassi?


Risposte:


Hai trovato un esempio di inizializzatori designati. C99 e C11 non vanno così lontano come il tuo esempio, ma hanno un supporto abbastanza flessibile per questo tipo di comportamento. Il tuo esempio specifico (usando il ... ) è un'estensione GCC. Dal link:



Ciò significa che il tuo esempio sta creando un array di dimensioni MAX_DEVICES e inizializzare ogni elemento in quell'array su -1 .


Per riferimento, l'unico comportamento supportato dallo standard consiste nell'assegnare indici specifici, anziché intervalli:



C'è un esempio più complicato nella mia copia delle specifiche:


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

Che inizializza i primi cinque e gli ultimi cinque elementi dell'array su valori espliciti. I valori intermedi (se presenti) sarebbero 0 .