2015-11-17 32 views
9

nel kernel di Linux, vedo una dichiarazione di un array di struct che assomiglia a questoC array di struct dichiarazione

struct SomeStructName [] ={ 
[SOMEWEIRD_NAME] = { 
        .field1 = "some value" 
        }, 
[SOMEWEIRD_NAME2] = { 
        .field1 = "some value1" 
        }, 
} 

Non ho mai visto una dichiarazione del genere, in particolare non riesco a capire cosa [SOMEWEIRD_NAME] significa, e perché è usato.

+3

Si tratta di un'estensione GNU per [inizializzatori designati] (https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html). – Kninnug

+0

@Kninnug non è un'estensione GNU, è valido C99 – ouah

+0

@ouah pensavo che C99 permettesse solo la sintassi '.field'. Sembra che mi sia sbagliato, sebbene GCC abbia una sintassi aggiuntiva non nello standard. – Kninnug

risposta

5

È un C99 designated initializer per gli array.

Ad esempio:

/* 
* Initialize element 0 to 1 
*      1 to 2 
*      2 to 3 
*     255 to 1 
* and all other elements to 0 
*/ 
int arr[256] = {[0] = 1, 2, 3, [255] = 1}; 

Consente di inizializzare alcuni elementi dell'array specifici in qualsiasi ordine e permette inoltre di omettere alcuni elementi.

Nell'esempio l'espressione tra [] può essere un nome di macro per un'espressione costante intera o una costante enum. Non può essere un nome di variabile in quanto deve essere un'espressione costante intera.

1

Il "SOMEWEIRD_NAME" è molto probabilmente un #define il cui valore è un numero, o è un'enumerazione, il cui valore numerico è la sua posizione nell'enumerazione.

+0

Sì, nel mio caso si trattava in realtà di una enumerazione interpretata come un numero intero dal compilatore, quindi SOMEWEIRD_NAME diventa 0 –

2

Non sono sicuro di cosa intendessi, ma presumo che SOMEWEIRD_NAME sia un valore Definisci.

Definire è un modo per dare valori un altro nome ma non lo prendono spazio nel you'r memorry il tempo di esecuzione, invece, verrà sostituito in tutto il mondo il nome che i valori definiti è redigendi nel codice durante prosses compilazione.

La sintassi per deifne è come il seguente: #define NAME_OF_DEFINE 80 nel seguente esempio ogni NAME_OF_DEFINE nel codice verrà sostituito briciolo i valori 80. Avviso che non si deve terminare la linea di Pentecoste ;.

Nell'esempio mi aspetto che SOMEWEIRD_NAME abbia un valore numerico per impostare la dimensione dell'array.

È possibile mettere ulteriori informazioni su #definehere