C中的“ [0…255] =”语法是什么?


108

参照js0n.c

代码语法如下:

    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;

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

谁能解释在这里做什么?语法[0 ... 255]&&l_bad在这里做什么?

Answers:


109

... 是GCC提供的扩展

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

要将一系列元素初始化为相同的值,请写入[first ... last] = value。这是一个GNU扩展。例如,

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

&& 是另一个扩展

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

您可以使用一元运算符获取当前函数(或包含函数)中定义的标签的地址&&。该值具有类型void *。该值是一个常量,可以在该类型的常量有效的任何地方使用。例如:

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

22
将所有代码放在一起,就可以创建一个跳转表,该跳转表使用ascii值作为索引,大概是用于解析器。
棘轮怪胎2015年

1
据我所知,具体来说是JSON解析器。
凯文

1
@KevinM很有道理。何时将地址运算符(&)应用于右值成为语法错误?我猜是在C99中吗?我上次定期使用Visual C ++是在1998年左右,那是C99之前的ANSI标准,然后编译器允许使用它(我知道,因为我记得加倍&投入生产代码的错字!)。
dodgethesteamroller 2015年

3
@dodgethesteamroller &&是一个与完全分开的标记&,因此&&x无论C的值类别如何,标准C语法都无法将其解释为“ x的地址的地址” &x
塔维安·巴恩斯

4
@dodgethesteamroller:--始终解析为--,并且&&始终解析为&&。C99§6.4¶4:下一个预处理令牌是可以构成预处理令牌的最长字符序列
ninjalj,2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.