Подтвердить что ты не робот

Что такое "..." в коммутаторе в коде 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" не упоминает об этом?

4b9b3361

Ответ 1

Это расширение gcc gcc extensions. Похоже, clang также поддерживает это, чтобы попытаться оставаться совместимым с gcc. Использование флага -pedantic в gcc или clang предупреждает вас о том, что это нестандартное значение, например:

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

case '0'... '7': диапазон диапазонов Speciacation в gcc.

Спецификация диапазона для оператора case.

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

case '0' or case '1' or case '3' and so on case '7':
or case 'b' :
just return buffer[1];