C'deki bu “[0… 255] =” sözdizimi nedir?


108

Atıfta js0n.c

Kod söz dizimi aşağıdaki gibidir:

    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;

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

Burada ne yapıldığını kimse açıklayabilir mi? Sözdizimi [0 ... 255]ve &&l_badburada ne yapıyor ?

Yanıtlar:


109

... GCC tarafından sağlanan bir uzantıdır

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

Bir dizi öğeyi aynı değerle başlatmak için yazın [first ... last] = value. Bu bir GNU uzantısıdır. Örneğin,

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

&& başka bir uzantı

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

Tekli operatör ile mevcut fonksiyonda (veya içeren bir fonksiyonda) tanımlanan bir etiketin adresini alabilirsiniz &&. Değerin türü vardır void *. Bu değer bir sabittir ve bu türden bir sabitin geçerli olduğu her yerde kullanılabilir. Örneğin:

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

22
hepsini bir araya getirirsek, kod, muhtemelen bir ayrıştırıcı için, indisler için ascii değerlerini kullanan bir atlama tablosu yapmaktır.
cırcır ucube

1
Anlayabildiğim kadarıyla özellikle bir JSON ayrıştırıcısı.
Kevin

1
@KevinM bu mantıklı. İşlecin adresini (&) bir r değerine uygulamak ne zaman bir sözdizimi hatası oldu? C99'da tahmin ediyorum, belki? Visual C ++ 'ı en son düzenli olarak kullandığım 1998 yılı civarındaydı, bu C99 öncesi ANSI standardı olurdu ve derleyici o zaman buna izin verdi (biliyorum çünkü &üretim koduna iki katına çıkmış bir yazım hatası hatırlıyorum !).
dodgethesteamroller

3
@dodgethesteamroller &&, öğesinden tamamen ayrı bir belirteçtir &, bu nedenle standart C dilbilgisinin &&xdeğer kategorisine bakılmaksızın "x adresinin adresi" olarak yorumlanmasına imkan yoktur &x.
Tavian Barnes

4
@dodgethesteamroller: --her zaman olarak ayrıştırılır --ve &&her zaman olarak ayrıştırılır &&. C99 §6.4¶4: bir sonraki önişleme simgesi, bir ön işleme belirteci oluşturabilecek en uzun karakter dizisidir
ninjalj
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.