2015-05-22 5 views
107

riferendosi la js0n.cCos'è questa sintassi "[0 ... 255] =" in C?

La sintassi del codice è il seguente:

static void *gostruct[] = 
    { 
     [0 ... 255] = &&l_bad, 
     ['\t'] = &&l_loop, [' '] = &&l_loop, ['\r'] = &&l_loop, ['\n'] = &&l_loop, 
     ['"'] = &&l_qup, 
     [':'] = &&l_loop, [','] = &&l_loop, 
     ['['] = &&l_up, [']'] = &&l_down, // tracking [] and {} individually would allow fuller validation but is really messy 
     ['{'] = &&l_up, ['}'] = &&l_down, 
     ['-'] = &&l_bare, [48 ... 57] = &&l_bare, // 0-9 
     [65 ... 90] = &&l_bare, // A-Z 
     [97 ... 122] = &&l_bare // a-z 
    }; 

........ 
....... 

l_bad: 
    *vlen = cur - json; // where error'd 
    return 0; 

........ 
........ 

Qualcuno può spiegare cosa si sta facendo qui? Cosa fa la sintassi [0 ... 255] e &&l_bad qui?

risposta

107

... è un'estensione fornita da GCC

https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html#Designated-Inits

Per inizializzare una serie di elementi sullo stesso valore, scrivere [first ... last] = value. Questa è un'estensione GNU. Ad esempio,

int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 }; 

&& è un'altra estensione

https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html#Labels-as-Values

È possibile ottenere l'indirizzo di un'etichetta definita nella funzione corrente (o una funzione di contenimento) con il unario operatore &&. Il valore ha tipo void *. Questo valore è una costante e può essere utilizzato ovunque sia valida una costante di quel tipo. Ad esempio:

void *ptr; 
/* ... */ 
ptr = &&foo; 
+21

mettere tutto insieme che il codice sta facendo una tabella salto che utilizza valori ASCII per indici, presumibilmente per un parser. –

+1

In particolare un parser JSON, per quanto posso dire. – Kevin

+0

Quindi, poiché le etichette e le variabili hanno spazi dei nomi separati, come fa il parser a distinguere '&& foo' che significa" indirizzo dell'etichetta 'pippo'" da '&& foo' che significa" indirizzo dell'indirizzo della variabile 'pippo'"? (Prendere l'indirizzo di un indirizzo produce, credo, un comportamento indefinito, ma è validamente sintattico.) – dodgethesteamroller