Cos’è la syntax di inizializzazione della struttura con tag?

struct file_operations scull_fops = { .owner = THIS_MODULE, .llseek = scull_llseek, .read = scull_read, .write = scull_write, .ioctl = scull_ioctl, .open = scull_open, .release = scull_release, }; 

Questa dichiarazione utilizza la syntax di inizializzazione della struttura con tag C standard.

Qualcuno può elaborare?

Quando si utilizzano gli inizializzatori aggregati (inizializzatori in {} ) nel linguaggio ANSI C “tradizionale” (C89 / 90), è necessario fornire un inizializzatore individuale per ogni membro della struttura nell’ordine, iniziando dal primo. Per esempio

 struct S { int a, b, c, d; }; struct S s = { 1, 2, 3, 4 }; /* 1 for `sa`, 2 for `sb` and so on... */ 

Non è necessario specificare gli inizializzatori per tutti i membri, ovvero è ansible interrompere in qualsiasi momento (i membri rimanenti saranno inizializzati a zero).

Se per qualche ragione ti preoccupavi solo di inizializzare esplicitamente il terzo membro della struttura, dovevi fornire inizializzatori “fittizi” per il primo e il secondo membro (solo per arrivare al terzo desiderato)

 /* We only care to explicitly initialize `sc` */ struct S s = { 0, 0, 3 }; /* but we have to explicitly initialize `sa` and `sb` as well */ 

o abbandonare completamente l’inizializzazione specifica (probabilmente sostituendolo con generico = { 0 } ) e utilizzare un successivo assegnamento a membri specifici

 struct S s = { 0 }; sc = 3; 

Un vantaggio notevole di questo approccio basato sull’assegnazione è che è indipendente dalla posizione del membro c nella dichiarazione della struct S

La nuova specifica del linguaggio C (C99) consente di utilizzare gli inizializzatori “taggati” fornendo il nome del membro desiderato all’interno di {}

 struct S s = { .c = 3 }; 

In questo modo, si inizializzano solo esplicitamente i membri desiderati (e si fa in modo che il compilatore azzeri il resto). Questo non solo ti risparmia un po ‘di digitazione, ma rende anche gli inizializzatori aggregati indipendenti dall’ordine in cui i membri sono specificati nella dichiarazione del tipo struct.

Gli inizializzatori aggregati, come probabilmente sapete, possono essere utilizzati anche con gli array. E C99 supporta anche l’inizializzazione “tagged” con array. Come appaiono i “tag” in caso di array è il seguente esempio

 int a[10] = { [5] = 3 }; /* `a[5]` is initialized with 3, the rest of `a` is zero-initialized */ 

Vale la pena notare ancora una volta che il linguaggio C continua a seguire l’approccio “tutto o niente” per l’inizializzazione dell’aggregazione: se si specifica un inizializzatore esplicito per un solo (o alcuni) membri di una struct o di un array, l’intero aggregato diventa inizializzato e i membri senza inizializzatori espliciti vengono inizializzati a zero.

Stai usando i nomi dei membri della struttura per inizializzare la struttura. cioè ogni inizializzazione di un membro è “taggata” con il nome di quel membro.

Un altro vantaggio che vale la pena menzionare per questo tipo di inizializzazione è che consente il riordino dei membri della struttura, che in alcuni casi può migliorare le prestazioni, ad esempio posizionando i puntatori ai membri frequentemente consultati nella stessa riga della cache hardware.