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.