2014-09-24 15 views
15

Qualcuno può spiegarmi la sintassi di questa funzione? dove SYS_fork è un po 'costante e sys_fork è una funzione.C Funzione Spiegazione

static int (*syscalls[])(void) = { 
[SYS_fork] sys_fork, 
[SYS_exit] sys_exit, 
[SYS_wait] sys_wait, 
[SYS_pipe] sys_pipe, 
[SYS_read] sys_read, 
[SYS_kill] sys_kill, 
[SYS_exec] sys_exec, 
}; 

Grazie!

+1

Abbastanza sicuro che questo abbia bisogno di più contesto. –

risposta

26

Si è appena verificato l'utilizzo di designated initializers. Esistono in C99 e sono anche disponibili come estensione GCC, ampiamente utilizzata nel codice del kernel di Linux (tra gli altri).

Dalla documentazione:

In ISO C99 si può dare gli elementi [dell'array] in qualsiasi ordine, indicando l'array o nomi di campo struttura applicate agli e GNU C, permette questo come un'estensione anche in modalità C90. [...]

Per specificare un indice di matrice, scrivere '[indice] =' prima del valore dell'elemento. Ad esempio,

int a[6] = { [4] = 29, [2] = 15 }; 

è equivalente a:

int a[6] = { 0, 0, 15, 0, 29, 0 }; 

[...]

Una sintassi alternativa per questo che è stato obsoleta dal GCC 2.5, ma GCC accetta ancora è quello di scrivere ' [indice] 'prima del valore dell'elemento, senza' = '.

In inglese semplice, syscalls is a static array of pointer to function taking void and returning int. Gli indici di array sono costanti e il loro valore associato è l'indirizzo di funzione corrispondente.

+0

Grazie mille. Ora è chiaro :) – user2517839

+3

Il codice pubblicato non avrebbe bisogno di segni '=' s basati su quella descrizione? – Tommy

+0

@dolan: Puoi spiegare come sono i valori SYS_fork, SYS_exit ..... che agiscono come indici? :-) –