Qual è la sintassi "[0… 255] =" in C?


108

Facendo riferimento a js0n.c

La sintassi del codice è la 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 significa sintassi [0 ... 255]e &&l_badcosa fare qui?

Risposte:


109

... è un'estensione fornita da GCC

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

Per inizializzare un intervallo di elementi con lo stesso valore, scrivi [first ... last] = value. Questa è un'estensione GNU. Per 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 contenitore) con l'operatore unario &&. Il valore ha tipo void *. Questo valore è una costante e può essere utilizzato ovunque sia valida una costante di quel tipo. Per esempio:

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

22
mettendo tutto insieme quel codice sta creando una tabella di salto che utilizza valori ASCII per gli indici, presumibilmente per un parser.
Maniaco del cricchetto

1
In particolare un parser JSON, per quanto ne so.
Kevin

1
@KevinM che ha senso. Quando è diventato un errore di sintassi applicare l'operatore address-of (&) a un rvalue? Immagino che in C99, forse? L'ultima volta che ho usato Visual C ++ regolarmente è stato intorno al 1998, che sarebbe stato lo standard ANSI pre-C99, e il compilatore lo ha permesso allora (lo so perché ricordo un errore di battitura di un raddoppio &nel codice di produzione!).
dodgethesteamroller

3
@dodgethesteamroller &&è un token completamente separato da &, quindi non è possibile interpretare la grammatica C standard &&xcome "indirizzo dell'indirizzo di x" indipendentemente dalla categoria di valore di &x.
Tavian Barnes

4
@dodgethesteamroller: --viene sempre analizzato come --e &&viene sempre analizzato come &&. C99 §6.4¶4: il prossimo token di pre-elaborazione è la sequenza di caratteri più lunga che potrebbe costituire un token di pre-elaborazione
ninjalj
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.