Являются тройными точками внутри случая (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
, это может быть или не быть проблемой.)
Ответ 2
Это нестандартное языковое расширение.
Вероятно, GCC: http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Case-Ranges.html.
Ответ 3
Нет, это расширение GCC.
Ответ 4
Это не стандарт C, но это расширение, найденное в компиляторе Sun C.
Обратитесь к: 2.7 Диапазоны измерений в операциях с коммутаторами на веб-сайте Oracle.
ОБНОВЛЕНИЕ: По-видимому, не только Oracle!: -)