Являются ли тройные точки внутри регистра (регистр '0' ... '9' :) допустимым синтаксисом переключения языка Си? - PullRequest
13 голосов
/ 12 августа 2011

Я заметил это в файлах с открытым исходным кодом для 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':) в Си. Это действительный стандартный язык Си? Или это какая-то магия препроцессора? Что тут происходит?

Ответы [ 4 ]

10 голосов
/ 12 августа 2011

Это нестандартное расширение языка.

Вероятно, GCC: http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Case-Ranges.html.

9 голосов
/ 12 августа 2011

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

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

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

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

3 голосов
/ 12 августа 2011

Это не стандартный C, но это расширение, найденное в компиляторе Sun C.

См. 2.7 Диапазоны регистра в утверждениях коммутатора на веб-сайте Oracle.1006 * ОБНОВЛЕНИЕ: Судя по всему, не только Oracle!: -)

3 голосов
/ 12 августа 2011
...