Was ist diese "[0… 255] =" - Syntax in C?


108

Bezug nehmen zu Bezugnehmend 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 macht Syntax [0 ... 255]und &&l_badwas hier?

Antworten:


109

... ist eine Erweiterung von GCC

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

Schreiben Sie, um einen Bereich von Elementen mit demselben Wert zu initialisieren [first ... last] = value. Dies ist eine GNU-Erweiterung. Beispielsweise,

 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 Etiketts, das in der aktuellen Funktion (oder einer enthaltenden Funktion) definiert ist, 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. Beispielsweise:

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

22
Alles in allem ergibt dieser Code eine Sprungtabelle, die ASCII-Werte für Indizes verwendet, vermutlich für einen Parser.
Ratschenfreak

1
Speziell ein JSON-Parser, soweit ich das beurteilen kann.
Kevin

1
@ KevinM das macht Sinn. Wann wurde es zu einem Syntaxfehler, den Adressoperator (&) auf einen r-Wert anzuwenden? Ich vermute in C99 vielleicht? Das letzte Mal, dass ich Visual C ++ regelmäßig verwendete, war um 1998, was der ANSI-Standard vor C99 gewesen wäre, und der Compiler hat es dann zugelassen (ich weiß, weil ich mich an einen Tippfehler eines doppelten &Einstiegs in den Produktionscode erinnere !).
Dodgethesteamroller

3
@dodgethesteamroller &&ist ein völlig anderes Token als &, daher kann die Standard-C-Grammatik &&xunabhängig von der Wertekategorie von auf keinen Fall als "Adresse der Adresse von x" interpretiert werden &x.
Tavian Barnes

4
@dodgethesteamroller: --wird immer als analysiert --und &&wird immer als analysiert &&. C99 §6.4¶4: Das nächste Vorverarbeitungstoken ist die längste Folge von Zeichen, die ein Vorverarbeitungstoken darstellen könnten
Ninjalj
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.