【问题标题】:What is this "[0 ... 255] =" syntax in C?C中的“[0 ... 255] =”语法是什么?
【发布时间】:2015-05-22 04:51:53
【问题描述】:

参考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在这里做吗?

【问题讨论】:

    标签: c gcc-extensions


    【解决方案1】:

    ...是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;
    

    【讨论】:

    • 把所有代码放在一起,就是创建一个使用 ascii 值作为索引的跳转表,大概是为了解析器。
    • 据我所知,具体来说是一个 JSON 解析器。
    • @KevinM 这是有道理的。何时将地址运算符 (&) 应用于右值成为语法错误?我猜在C99,也许?我最后一次定期使用 Visual C++ 是在 1998 年左右,那是 C99 之前的 ANSI 标准,当时编译器允许使用它(我知道是因为我记得在生产代码中出现了一个双倍 & 的错字! )。
    • @dodgethesteamroller && 是与 & 完全不同的标记,因此标准 C 语法无法将 &&x 解释为“x 地址的地址”,无论&x.
    • @dodgethesteamroller:-- 始终被解析为 --&& 始终被解析为 &&。 C99 §6.4¶4:下一个预处理标记是可以构成预处理标记的最长字符序列
    猜你喜欢
    • 1970-01-01
    • 2015-04-26
    • 2020-04-18
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    相关资源
    最近更新 更多