Являются тройными точками внутри случая (case '0'... '9':) действительный синтаксис языка синтаксиса языка?

Я заметил это в файлах с открытым исходным кодом для 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;
}

Я никогда не видел эту конструкцию "тройной точки" (case '0' ... '9':) в C раньше. Является ли он допустимым стандартным языком C? Или это какая-то препроцессорная магия? Что здесь происходит?

Ответ 1

Как говорили другие, это расширение для компилятора. Вызовите компилятор с нужными параметрами (например, gcc -std=c99 -pedantic), и он должен предупредить вас об этом.

Я также укажу, что его использование потенциально опасно, кроме того, что другой компилятор не может его реализовать. 'a' ... 'z' обозначает 26 строчных букв - но стандарт C не гарантирует, что их значения смежны. В EBCDIC, например, между буквами есть знаки пунктуации.

С другой стороны, я сомневаюсь, что либо gcc, либо Sun C поддерживают системы, которые используют набор символов, в котором буквы не смежны. (Они находятся в ASCII и всех его производных, включая Latin-1, Windows-1252 и Unicode.)

С другой стороны, он исключает буквы с акцентом. (В зависимости от того, как используется DRBD, это может быть или не быть проблемой.)

Ответ 3

Нет, это расширение GCC.