【问题标题】:Are triple dots inside a case (case '0' ... '9':) valid C language switch syntax? [duplicate]案例中的三个点(案例'0' ... '9':) 是有效的C 语言切换语法吗? [复制]
【发布时间】:2011-08-12 17:11:37
【问题描述】:

我在 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 语言吗?或者这是某种预处理器魔法?这里发生了什么?

【问题讨论】:

标签: c switch-statement


【解决方案1】:

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

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

【讨论】:

  • 会不会被纳入下一个标准?
  • @osgx:不,至少在C1X的最新草案中没有。
  • @osgx:不在 C11 中,不在 C17 中,也不建议用于 C2X。
【解决方案2】:

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

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

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

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

【讨论】:

  • 如果gcc有一个端口支持EBCDIC,那就是s390x-ibm-tpf
【解决方案3】:

不,这是extension of GCC

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-04-29
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多