Was ist das “[0 … 255] =”-Syntax in C?

Lesezeit: 2 Minuten

Benutzeravatar von Gaurav K
Gaurav K

Bezug nehmen zu js0n.c

Die Codesyntax lautet wie folgt:

    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;

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

Kann jemand erklären, was hier gemacht wird? Was bedeutet syntax [0 ... 255] und
&&l_bad hier machen?

... ist eine von GCC bereitgestellte Erweiterung

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

Um eine Reihe von Elementen mit demselben Wert zu initialisieren, schreiben Sie [first ...
last] = value
. Dies ist eine GNU-Erweiterung. Zum Beispiel,

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

&& ist eine weitere Erweiterung

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

Sie können die Adresse eines in der aktuellen Funktion (oder einer enthaltenden Funktion) definierten Labels mit dem unären Operator abrufen &&. Der Wert hat Typ void *. Dieser Wert ist eine Konstante und kann überall dort verwendet werden, wo eine Konstante dieses Typs gültig ist. Zum Beispiel:

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

  • Zusammenfassend macht dieser Code eine Sprungtabelle, die ASCII-Werte für Indizes verwendet, vermutlich für einen Parser.

    – Ratschenfreak

    22. Mai 2015 um 9:29 Uhr

  • Insbesondere ein JSON-Parser, soweit ich das beurteilen kann.

    – Kevin

    22. Mai 2015 um 14:08 Uhr

  • @KevinM das macht Sinn. Wann wurde es zu einem Syntaxfehler, den Adressoperator (&) auf einen Rvalue anzuwenden? Ich vermute in C99, vielleicht? Das letzte Mal, als ich Visual C++ regelmäßig verwendet habe, war ungefähr 1998, was der ANSI-Standard vor C99 gewesen wäre, und der Compiler hat es damals erlaubt (ich weiß es, weil ich mich an einen Tippfehler eines verdoppelten & in den Produktionscode einsteigen!).

    – Weiche der Dampfwalze aus

    22. Mai 2015 um 16:22 Uhr


  • @dodgethesteamroller && ist ein völlig separates Token von &also gibt es keine Möglichkeit, die Standard-C-Grammatik zu interpretieren &&x als “Adresse der Adresse von x” unabhängig von der Wertekategorie von &x.

    – Tavian Barnes

    22. Mai 2015 um 16:48 Uhr

  • @dodgethesteamroller: -- wird immer geparst als --und && wird immer geparst als &&. C99 §6.4¶4: das nächste Vorverarbeitungstoken ist die längste Folge von Zeichen, die ein Vorverarbeitungstoken bilden könnte

    – ninjalj

    22. Mai 2015 um 18:40 Uhr


1421730cookie-checkWas ist das “[0 … 255] =”-Syntax in C?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy