案例中是否有三点(案例'0'...'9':)有效的C语言切换语法?

时间:2011-08-12 17:11:38

标签: c switch-statement

我在DRBD软件(user/drbdtool_common.c

的开源代码文件中注意到了这一点
const char* shell_escape(const char* s)
{
    /* ugly static buffer. so what. */
    static char buffer[1024];
    char *c = buffer;

    if (s == NULL)
        return s;

    while (*s) {
        if (buffer + sizeof(buffer) < c+2)
            break;

        switch(*s) {
        /* set of 'clean' characters */
        case '%': case '+': case '-': case '.': case '/':
        case '0' ... '9':
        case ':': case '=': case '@':
        case 'A' ... 'Z':
        case '_':
        case 'a' ... 'z':
            break;
        /* escape everything else */
        default:
            *c++ = '\\';
        }
        *c++ = *s++;
    }
    *c = '\0';
    return buffer;
}

我以前从未在C中看到过这种“三点”结构(case '0' ... '9':)。它是一种有效的标准C语言吗?或者是某种预处理器魔术?这里发生了什么?

4 个答案:

答案 0 :(得分:10)

这是一种非标准的语言扩展。

可能是GCC:http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Case-Ranges.html

答案 1 :(得分:9)

正如其他人所说,这是一个特定于编译器的扩展。使用正确的选项(例如gcc -std=c99 -pedantic)调用编译器,它应该警告你。

我还要指出,除了另一个编译器可能没有实现它之外,它的使用是有潜在危险的。 'a' ... 'z'表示26个小写字母 - 但C标准不保证它们的值是连续的。例如,在EBCDIC中,字母中有标点字符。

另一方面,我怀疑gcc或Sun C是否支持使用字符连续的字符集的系统。 (它们是ASCII及其所有衍生物,包括Latin-1,Windows-1252和Unicode。)

另一方面,它排除了重音字母。 (取决于DRBD的使用方式,这可能是也可能不是问题。)

答案 2 :(得分:3)

不,这是extension of GCC

答案 3 :(得分:3)

这不是标准C,而是Sun C编译器中的扩展。

请参阅:Oracle网站上的2.7 Case Ranges in Switch Statements

更新:显然,不只是甲骨文! : - )