Что такое "..." в switch-case в коде C

Вот кусок кода в /usr/src/linux-3.10.10-1-ARCH/include/linux/printk.h:

static inline int printk_get_level(const char *buffer)
{
  if (buffer[0] == KERN_SOH_ASCII && buffer[1]) {
    switch (buffer[1]) {
    case '0' ... '7':
    case 'd':  /* KERN_DEFAULT */
      return buffer[1];
    }
  }
}

Это своего рода оператор? Почему "Язык программирования C" не упоминает об этом?

4 ответа

Решение

Это gcc Расширение называется case case, вот как это объясняется в документе:

Вы можете указать диапазон последовательных значений в одной метке регистра, например так:

case low ... high:

Вы можете найти полный список расширений gcc здесь. Кажется, что Clang также поддерживает это, чтобы попытаться остаться совместимым с gcc, С использованием -pedantic флаг в любом gcc или же clang предупредит вас, что это нестандартно, например:

warning: range expressions in switch statements are non-standard [-Wpedantic]

Интересно отметить, что ядро Linux использует множество расширений gcc, одно из расширений, не рассматриваемых в статье, - это выражения операторов.

Это расширение компилятора gcc, позволяющее объединить несколько операторов case в одну строку.

Осторожно, это не стандартная версия C и, следовательно, не переносимая. Это стенография, разработанная для описания случаев. Это хорошо определено, так как в C вы можете включать только целочисленные типы.

В стандартном С, ... используется только в списках аргументов переменной длины.

case '0'...'7': диапазоны регистров Speciacation в gcc.

Спецификация диапазона для описания случая.

Пишите пробелы вокруг..., иначе он может быть неверно проанализирован, если вы используете его с целочисленными значениями

case '0' or case '1' or case '3' and so on case '7':
or case 'b' :
just return buffer[1]; 
Другие вопросы по тегам