Quelle est cette syntaxe «[0… 255] =» en C?


108

Se référant à js0n.c

La syntaxe du code est la suivante:

    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;

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

Quelqu'un peut-il expliquer ce qui se fait ici? Que fait la syntaxe [0 ... 255]et que &&l_badfaire ici?

Réponses:


109

... est une extension fournie par GCC

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

Pour initialiser une plage d'éléments à la même valeur, écrivez [first ... last] = value. Ceci est une extension GNU. Par exemple,

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

&& est une autre extension

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

Vous pouvez obtenir l'adresse d'une étiquette définie dans la fonction courante (ou une fonction contenant) avec l'opérateur unaire &&. La valeur a le type void *. Cette valeur est une constante et peut être utilisée partout où une constante de ce type est valide. Par exemple:

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

22
en rassemblant le tout, ce code crée une table de sauts qui utilise des valeurs ascii pour les indices, vraisemblablement pour un analyseur.
ratchet freak

1
Plus précisément, un analyseur JSON, pour autant que je sache.
Kevin

1
@KevinM qui a du sens. Quand est-ce devenu une erreur de syntaxe d'appliquer l'opérateur d'adresse de (&) à une rvalue? Je suppose que dans C99, peut-être? La dernière fois que j'ai utilisé Visual C ++ régulièrement, c'était vers 1998, ce qui aurait été le standard ANSI pré-C99, et le compilateur l'a alors autorisé (je le sais parce que je me souviens d'une faute de frappe d'un doublé &entrant dans le code de production!).
dodgethesteamroller

3
@dodgethesteamroller &&est un jeton entièrement distinct de &, il n'y a donc aucun moyen pour la grammaire C standard de l'interpréter &&xcomme "adresse d'adresse de x" quelle que soit la catégorie de valeur de &x.
Tavian Barnes

4
@dodgethesteamroller: --est toujours analysé comme --, et &&est toujours analysé comme &&. C99 §6.4¶4: le prochain jeton de prétraitement est la plus longue séquence de caractères pouvant constituer un jeton de prétraitement
ninjalj
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.